Извините, я снова!
Несмотря на то, что мне становится лучше с ООП в Фортране (что, вероятно, самая безумная вещь, с которой я когда-либо работал), у меня возникают трудности с наследованием.К сожалению, я не понимаю синтаксис, который позволяет мне это делать.
По сути, я хочу переопределить оператор присваивания =
, который позволяет мне возвращать любой тип примитива .Базовый пример только с одним типом примитива (реальный) будет выглядеть следующим образом:
module overload
implicit none
public func, assignment(=)
interface assignment(=)
module procedure equalAssignmentReal
!! additional procedures for integer, character, logical if neccessary
end interface
contains
subroutine equalAssignmentReal(lhs, rhs) !! <-- all these subroutines should be in the parent class
implicit none
real, intent(out) :: lhs
class(*), intent(in) :: rhs
select type(rhs)
type is (real)
lhs = rhs
end select
return
end subroutine equalAssignmentReal
function func(string) result(res) !! <-- I want this function in the child class
implicit none
character(len=*), intent(in) :: string
class(*), allocatable :: res
if ( string == "real" ) allocate(res, source=1.0)
return
end function func
end module overload
program test
use overload
implicit none
real :: var
var = func('real')
print *, "var = ", var
end program test
Это работает при компиляции с GNU Fortran (не с Intel, поскольку ониразрешить внутреннюю перегрузку присваивания).Итак, мой вопрос теперь состоит в том, как бы определить родительский класс в отдельном модуле, который содержит все перегрузки присваивания (действительные, целые, символьные, логические) и использовать эти переопределения в дочернем классе который содержит только func
?В программу я только хочу включить дочерний класс и присвоить значение с чем-то вроде:
type(child_class) :: child
real :: var
var = child%func('real')
Любая помощь приветствуется!