Можно ли перегрузить отложенную процедуру неполиморфной процедурой?
Я хотел бы создать абстрактный класс (Parent
) с процедурой (foo
), которая должна быть перегружена каждым классом, расширяющим Parent
. Я сталкиваюсь с проблемами, когда хочу снова расширить, например, класс (Grandchild
) расширяет класс (Child
), который расширяет Parent
.
Поскольку Child не является абстрактным, его foo (foo_Child
) должен быть полиморфным. Но тогда Grandchild
наследует foo_Child
, а не определяет foo_Grandchild
. Кроме того, поскольку я не хочу, чтобы foo_Child
был полиморфным, я хочу иметь возможность использовать неполиморфные функции, специфичные для Child
, внутри foo_Child
.
module test_module
type, abstract :: Parent
contains
procedure(foo_Parent), deferred :: foo
end type
abstract interface
subroutine foo_Parent(this,input)
import Parent
class(Parent), intent(out) :: this
character(*), intent(in) :: input
end subroutine
end interface
type, extends(Parent) :: Child
contains
procedure :: foo => foo_Child
end type
type, extends(Child) :: Grandchild
! Is not required to define foo=>foo_Grandchild.
! This is not the behaviour I want.
end type
interface Child
module procedure new_Child
end interface
contains
function new_Child(input) result(this)
character(*), intent(in) :: input
type(Child) :: this
end function
subroutine foo_Child(this,input)
type(Child), intent(out) :: this ! Fails: 'this' is not polymorphic.
character(*), intent(in) :: input
this = Child(input) ! Fails if type(Child) is replaced by class(Child).
end subroutine
end module
program test
use test_module
end program
Чтобы обобщить:
Есть ли способ сделать foo_Child
неполиморфным, но при этом перегрузить foo_Parent
? Или есть способ вызова неполиморфных функций (по крайней мере, Child=Child
присваивания с неполиморфной правой стороной) в полиморфной процедуре? Если нет, есть ли обходной путь?
(Я не хочу определять class(Child)=type(Child)
, но буду, если это единственный вариант).
type(Child)
наclass(Child)
, чтобы избежать ошибки, я больше не смогу использоватьthis=Child(input)
, аGrandchild
наследуетfoo_Child
, что мне не нужно. - person veryreverie   schedule 03.05.2018class(...) :: this
, а неtype(...) :: this
. Думаю, я использую полиморфную процедуру как сокращение для процедуры с полиморфным аргументом. - person veryreverie   schedule 03.05.2018object%foo(input)
преобразует строкуinput
вobject
. Тогда все, что расширяетParent
, может быть прочитано из строки. В модулеParent
есть куча операций с файлами и тому подобное, с кучей функций, которые принимаютclass(Parent) :: this
в качестве аргументов. Мне нужен какой-то способ гарантировать, что каждый класс, расширяющийParent
, имеет процедуруfoo
, которую можно вызывать из модуляParent
. - person veryreverie   schedule 03.05.2018select type(this); type is(Child)
, я могу рассматриватьthis
как неполиморфный. Это не решает проблему наследования внукомfoo_Child
и похоже на взлом, но пока работает. Спасибо всем. - person veryreverie   schedule 03.05.2018