我在Fortran2003中编写链表结构。这个链表中的节点有两个交替的变体。该列表表示边缘的拓扑环,每条边被两个顶点限定,并且每个顶点连接到两条边。 这些结构被声明为抽象的NODE_T类型,并由两个子类VN_T和EN_T实现。 VN_T指向两个EN_T,反之亦然。 由于列表在类型之间交替,指针存储在子类中。 我的问题是将类型绑定函数(方法?)添加到名为NEXT()和PREV()的VN_T和EN_T,并且通过多态性执行正确的操作。 VN_T%NEXT()应跳过两个步骤,并获取下一个VN_T(与EN_T分隔开始的一个)。重载的函数在fortran 2003中的抽象接口旁边返回指向基类型的指针?
我喜欢的类型/类的定义如下:
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撰写[R 2011,即V12.0)与消息
error #8314: If the rightmost part-name is of abstract type, data-ref shall be polymorphic [NEXT]
NODE2 => NODE1%NEXT()
---------------------------^
了基于此this documentation似乎表明,它正试图NEXT在基类调用procdure而不是选择的子类实现的一个抱怨(它应该能够根据NODE1的具体类型在右侧进行,对吗?)。
我是F2003的OOP功能的新手,所以我在JAVA中制作了这个模式的样机,让我满意。任何人都可以阐明这是否是a)F2003的OOP行为有所不同,2)编译器bug或3)我只是在使用智能...
更新到更新9包300允许这种使用的编译,感谢您的帮助。 – RFairey 2012-05-01 14:51:27