関連情報
ナビゲーション: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)が呼び出されることになります。

Results matter. Trust NAG.
Privacy Policy | Trademarks