我正在写在Fortran2003一个链表结构。 在这个链表中的节点有两个品种交替。 列表表示边缘的环拓扑,每个边缘是由两个顶点界定,且每一顶点连接到两个边缘。 这些结构被声明为抽象NODE_T类型,和由两个子类,VN_T和EN_T实现。 一个VN_T分两个EN_Ts,反之亦然。 由于类型之间的交替表,指针存储在子类。 我的问题是与添加型约束函数(方法?)来VN_T和EN_T被称为next()和prev(),并通过多态性做正确的事。 VN_T%NEXT()应该跳过两个步骤,并获得下一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
下一个/上一个例程的实现都大同小异,下一个/上和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()
然后我的编译器(英特尔Fortran XE作曲家2011年,即V12.0)与消息抱怨
error #8314: If the rightmost part-name is of abstract type, data-ref shall be polymorphic [NEXT]
NODE2 => NODE1%NEXT()
---------------------------^
其中在此基础上本文档似乎表明它正试图NEXT 基类调用procdure而不是选择子类实现之一(它应能根据具体类型NODE1的是在右边做右手边,是吧?)。
我在F2003的OOP功能的新,所以我做了这个模式在JAVA中,我得到了工作,我满意的样机。 任何人都可以阐明这是否是或者a)在F2003的OOP活动的差异,2)编译器错误或3)只是我是新空房禁地......