我正在用 Fortran2003 编写一个链表结构。此链表中的节点有两种交替出现。该列表表示边的拓扑环,每条边由两个顶点界定,每个顶点连接到两条边。这些结构被声明为抽象 NODE_T 类型,并由两个子类 VN_T 和 EN_T 实现。一个 VN_T 指向两个 EN_T,反之亦然。由于列表在类型之间交替,因此指针存储在子类中。我的问题是将类型绑定函数(方法?)添加到称为 NEXT() 和 PREV() 的 VN_T 和 EN_T,并通过多态性做正确的事情。VN_T%NEXT() 应该跳过两个步骤,并获得下一个 VN_T(与开始的 VN_T 相隔一个 EN_T)。
我的类型/类定义如下:
TYPE, ABSTRACT :: NODE_T
INTEGER :: IENT
INTEGER :: ISIDE
INTEGER :: ISUBTYPE
INTEGER :: IPAD
CONTAINS
PROCEDURE(NEXTA), DEFERRED :: NEXT
PROCEDURE(PREVA), DEFERRED :: PREV
END TYPE NODE_T
ABSTRACT INTERFACE
FUNCTION NEXTA(PENT)
IMPORT NODE_T
CLASS(NODE_T), POINTER :: NEXTA
CLASS(NODE_T) :: PENT
END FUNCTION
FUNCTION PREVA(PENT)
IMPORT NODE_T
CLASS(NODE_T), POINTER :: PREVA
CLASS(NODE_T) :: PENT
END FUNCTION
END INTERFACE
TYPE, EXTENDS(NODE_T) :: VN_T
DOUBLE PRECISION DT
CLASS(EN_T), POINTER :: N
CLASS(EN_T), POINTER :: P
CONTAINS
PROCEDURE :: NEXT => NEXTV
PROCEDURE :: PREV => PREVV
END TYPE
TYPE, EXTENDS(NODE_T) :: EN_T
CLASS(VN_T), POINTER :: N
CLASS(VN_T), POINTER :: P
CONTAINS
PROCEDURE :: NEXT => NEXTE
PROCEDURE :: PREV => PREVE
END TYPE
next/prev 例程的实现都大同小异,next/prev 和 EN/VN 的四种组合:
FUNCTION NEXTE(PENT)
CLASS(NODE_T), POINTER :: NEXTE
CLASS(EN_T) PENT
NEXTE => PENT%N%N
END FUNCTION
当我调用这些函数时:
CLASS(NODE_T), POINTER :: NODE1, NODE2
NODE2 => NODE1%NEXT()
然后我的编译器(Intel FORTRAN XE Composer 2011,即 v12.0)抱怨消息
error #8314: If the rightmost part-name is of abstract type, data-ref shall be polymorphic [NEXT]
NODE2 => NODE1%NEXT()
---------------------------^
基于此文档似乎表明它正在尝试在基类上调用 procdure NEXT 而不是选择其中一个子类实现(它应该能够根据右侧的 NODE1 的具体类型来执行此操作手边,对吧?)。
我是 F2003 的 OOP 功能的新手,所以我在 JAVA 中制作了这个模式的模型,我对它的工作感到满意。任何人都可以阐明这是否是a)F2003的OOP行为的差异,2)编译器错误或3)只是我脑残......