Fortran 2003 入門

ナビゲーション:前へ   上へ   次へ

2.4 型結合手続き

型結合手続きはその型に関する操作をひとまとめにするための方法を提供します。 また多相変数の動的な型に依存した手続きの動的呼出し機能も提供します。

2.4.1 型結合手続き部

型定義の型結合手続き部は CONTAINS 文により区切られます。 型結合手続きのデフォルトのアクセシビリティは(成分が非公開であった場合でも)公開(PUBLIC)です。 このアクセシビリティは PRIVATE 文を CONTAINS の後に指定することに より変更可能です。

2.4.2 個別型結合手続き

個別で無指定ではない型結合手続きの宣言の構文は次の通りです:

PROCEDURE [[,binding-attr-list]::] binding-name [=>procedure-name]

型結合手続きの名前は binding-name で、それを実装する実手続きの名前は procedure-name です。 オプショナルである=>procedure-name が省略された場合には、実手続き はbindingと同じ名前になります。

型結合手続きはその型のオブジェクトから呼び出されます。
例:

  CALL variable(i)%tbp(arguments)
通常、呼出し変数は追加の引数“渡されたオブジェクトの仮引数”として渡され ます。デフォルトではこれが実手続きの第一番目の仮引数となるので、引数並びの最初 の引数は第2番目の引数となります。 渡されたオブジェクトの仮引数はPASS(argument-name) 属性を持 つ型結合手続きを宣言することによって変更することが可能です。この場合、変数は 名前付き引数として渡されます。PASS 属性をデフォルト(最初の引数)の確認 のために使用することもできます。NOPASS 属性はオブジェクトを引数として渡 すことを阻止します。 渡されたオブジェクトの仮引数はその型の多相スカラ変数でなければなりません。 例えば CLASS(t) self です。

型を拡張する場合、新しい型は古い型の個々の型結合手続きを継承するか、もしくは それらをオーバーライドします。 オーバーライドする手続きは古い手続きと整合性が取れていなくてはなりません。 特に、渡されたオブジェクト(新しい型を持つ)以外のそれぞれの仮引数は同じ型を持っている必要があります。 NON_OVERRIDABLE として宣言された型結合手続きは型拡張においてオーバーライドできません。

型結合手続きが呼び出される場合に、 どの実手続きをコールするかを決めるのは変数の動的な型です。

型結合手続きが持ちうる他の属性には PUBLIC, PRIVATE, DEFERRED があります(最後のものは後述する抽象型にのみ関連します)。

2.4.3 総称型結合手続き

通常の総称手続きが個別手続きの集合であるのと同様、 総称型結合手続きは個別型結合手続きの集合で GENERIC 文により宣言します。
例:
  GENERIC :: generic_name => specific_name_1, specific_name_2, specific_name_3
総称型結合手続きは演算子であっても代入文であっても構いません。
例:
  GENERIC :: OPERATOR(+) => add_t_t, add_t_r, add_r_t
このような型結合総称演算子は NOPASS 属性を持つことができません。 渡されたオブジェクトの仮引数の動的な型が呼び出される実手続きを決定します。

型を拡張する場合、新しい型は必ずすべての総称型結合手続きを継承します。 新しい型は個別手続きを追加することによって総称を拡張することが可能です。 総称の手続きをオーバーライドする場合には個別型結合手続きをオーバーライドします。 例えば

  TYPE mycomplex
    ...
  CONTAINS
    PROCEDURE :: myc_plus_r => myc1_plus_r
    PROCEDURE,PASS(B) :: r_plus_myc => r_plus_myc1
    GENERIC :: OPERATOR(+) => myc_plus_r, r_plus_myc
  END TYPE
  ...
  TYPE,EXTENDS(mycomplex) :: mycomplex_2
    ...
  CONTAINS
    PROCEDURE :: myc_plus_r => myc2_plus_r
    PROCEDURE,PASS(B) :: r_plus_myc => r_plus_myc2
  END TYPE
において、型 mycomplex_2 は総称演算子 ‘+’ を継承します。 総称 (+) の呼出しにより個別型結合手続きが呼び出されますが、 mycomplex_2 型要素の場合にはオーバーライドする実手続き(myc2_plus_r もしくは r_plus_myc2)が呼び出されることになります。


ナビゲーション:前へ   上へ   次へ
関連情報
ご案内
© 日本ニューメリカルアルゴリズムズグループ株式会社 2025
Privacy Policy  /  Trademarks