Вот пример.
module example
type scheme_object
end type scheme_object
type, extends( scheme_object ) :: scheme_primitive_procedure
procedure(packageable_function), pointer, nopass :: proc_pointer
end type scheme_primitive_procedure
abstract interface
function packageable_function() result( retval )
import :: scheme_object
class(scheme_object), pointer :: retval
end function packageable_function
end interface
contains
recursive function make_primitive_procedure_object() result( retval_pointer )
type(scheme_primitive_procedure), pointer :: retval
class(scheme_object), pointer :: retval_pointer
allocate( scheme_primitive_procedure :: retval )
retval%proc_pointer => make_primitive_procedure_object
retval_pointer => retval
end function make_primitive_procedure_object
end module example
MWE немного усложняется во имя сокращения кода. Проще говоря, экземпляр sche_primitive_procedure должен инкапсулировать функции, возвращающие различные подтипы schema_object.
В make_primitive_procedure_object тип результата является подтипом circuit_object, представляющим функции, возвращающие объекты схемы.
Что не так с этим кодом? Проблема в том, что я действительно не хочу только_ возвращать классы (schema_object) из моих процедур. Я хочу, чтобы мои процедуры возвращали указатели на различные подтипы schema_object без явного приведения вверх.
Возможно ли это?