私はFortran2003にリンクリスト構造を書いています。このリンクされたリストのノードには、2つの種類があります。このリストは、エッジのトポロジーリングを表し、各エッジは2つの頂点で境界付けられ、各頂点は2つのエッジに接続します。 これらの構造体は抽象的なNODE_T型として宣言され、2つのサブクラスVN_TとEN_Tによって実装されます。 VN_Tは2つの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の4つの組み合わせと同じです:
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)がメッセージこのthis documentationに基づいて
error #8314: If the rightmost part-name is of abstract type, data-ref shall be polymorphic [NEXT]
NODE2 => NODE1%NEXT()
---------------------------^
と文句を言うことはベースクラス上の次のprocdureを呼び出そうというより、サブクラスの実装の1つを選択していることを示していると思われます(右、右側にあるNODE1の具体的なタイプに基づいて行うことができるはず?)。
私はF2003のOOP機能で新しいので、私は私が私の満足に働いてしまったJAVAでこのパターンのモックアップを作りました。誰もが、これはあなたがあなたのコンパイラを更新する必要があるかもしれませんF2003のOOP行動のa)の違い、2)コンパイラのバグまたは3)ちょうど私が脳死いる...
更新あなたの助けに感謝、使用のこの種は、コンパイルすることができます。 – RFairey