nor*_*rio 2 oop abstract-class fortran design-patterns type-extension
在 fortran 2003 中,是否可以定义具有抽象类型组件的派生类型?例如,如下所示,我想定义一个Sup具有type组件o_Abst的Abst类型。
TYPE, ABSTRACT :: Abst
CONTAINS
PROCEDURE(some_proc), deferred, pass :: some_proc
..
END TYPE Abst
TYPE :: Sup
PRIVATE
CLASS(Abst) :: o_Abst
..
CONTAINS
PROCEDURE :: another_proc
END TYPE Sup
Run Code Online (Sandbox Code Playgroud)
我已经遇到的一个问题是为Sup类型对象编写构造函数。我无法o_Abst通过内部赋值为组件赋值=(英特尔编译器说,“在内部赋值语句中,变量不应是多态的。”)。或者我不能为Abst类型对象编写构造函数,因为据我所知,如果传递的对象虚拟参数以外的参数是抽象类型,则无法正确覆盖延迟的类型绑定过程。
我也很高兴听到避免使用类似Sup. 如果使用抽象类型的组件来定义类型很诱人,那么一般有哪些替代策略?
派生类型可能具有带有抽象声明类型的多态组件。组件必须具有指针属性或可分配属性。
F2003 中不允许对多态对象进行内部赋值(如果被赋值的对象具有 allocatable 属性,则在 F2008 中是允许的,但 ifort 12.1 不支持)。在 F2003 中,带有 SOURCE 说明符的 ALLOCATE 语句可用于实现或多或少相同的结果。
您可以构造具有非抽象扩展Abst类型的对象(对象的动态类型是抽象的没有意义,因此不存在Abst自身的结构构造函数)。对于绑定到采用一个或多个抽象类型参数的类型的过程没有限制。