関連情報
ナビゲーション:Fortran 2003入門   前へ   上へ   次へ

2.1 型拡張

Fortran2003では型拡張によりオブジェクト指向の基本的な要素である継承と多相オブジェクト機能を提供します。

2.1.1 型の拡張

SEQUENCE型とBIND(C)型以外のすべての構造型は、 EXTENDSキーワードを用いて拡張することが可能です。 拡張された型は親の型のすべての成分を継承し、その上に独自の成分を追加することができます。

例:

  TYPE point
    REAL x,y
  END TYPE
  TYPE,EXTENDS(point) :: point_3d
    REAL z
  END TYPE
point_3d は3つの成分 x, y, z と継承部分を参照する point を持っています。 ここで成分 xpoint%x と同一です。

また、型を拡張する際に新しい成分を追加しなければいけないというわけではありません。例えば

  TYPE,EXTENDS(point) :: newpoint
  END TYPE
は新しい型 newpoint を定義しますが、この型はpoint(結合された親成分) と全く同じ成分を持ちます。
  TYPE empty_type
  END TYPE
この例では成分を全く含んでいない拡張可能な型 empty_type を宣言しています。

2.1.2 多相変数

多相変数は(TYPEキーワードではなく)CLASSキーワードにより宣言されたポインタ、 割付け配列、もしくは仮引数のいずれかです。

例:

  REAL FUNCTION bearing(a)
    CLASS(point) a
    bearing = atan2(a%y,a%x)
  END
関数 bearingTYPE(point) オブジェクトもしくは TYPE(point) の任意の拡張型オブジェクト(例えば TYPE(point_3d) が適用可能です。

2.1.3 型選択

SELECT TYPE 構文により多相変数の動的な型の調査とその変数の拡張成分へのアクセスが行えます。

例:

  CLASS(t) x
  ...
  SELECT TYPE(p=>x)
  TYPE IS (t1)
    !
    ! This section is executed only if X is exactly of TYPE(t1), not an
    ! extension thereof.  P is TYPE(t1).
    !
  TYPE IS (t2)
    !
    ! This section is executed only if X is exactly of TYPE(t2), not an
    ! extension thereof.  P is TYPE(t2).
    !
  CLASS IS (t3)
    !
    ! This section is executed if X is of TYPE(t3), or of some extension
    ! thereof, and if it is not caught by a more specific case.  P is CLASS(t3).
    !
  END SELECT
SELECT TYPE(x)’ は‘SELECT TYPE(x=>x)’の短縮形 です。

2.1.4 無限多相性

CLASS(*)’ の変数は無限多相変数です。 無限多相変数は型を持っていませんがどのような型を取ることもできます。 無限多相に対して演算を行うには、(割付け、解放、ポインタ代入を除き) まず最初にその型をSELECT TYPEで調べる必要があります。
例:
  CLASS(*),POINTER :: x
  CHARACTER(17),TARGET :: ch
  x => ch
  SELECT TYPE(x)
  TYPE IS (COMPLEX(KIND=KIND(0d0)))
    PRINT *,x+1
  TYPE IS (CHARACTER(LEN=*))
    PRINT *,LEN(x)
  END SELECT
CHARACTERの場合、長さは ‘*’ と指定されなくてはなりません。 そしてその長さは自動的に認識される点に注意してください。

拡張不可能な型(BIND(C) もしくは SEQUENCE)の場合には、 SELECT TYPE を使用して型を調べることができませんが代りに、 以下で示されるような安全ではないポインタ代入が認められています。
例:

  TYPE t
    SEQUENCE
    REAL x
  END TYPE
  CLASS(*),POINTER :: x
  TYPE(t),POINTER :: y
  ...
  y => x ! Unsafe - the compiler cannot tell whether X is TYPE(t).

2.1.5 アドホックな型比較

多相オブジェクトの動的な型を比較するために2つの新たな組込み関数が用意されて います。

EXTENDS_TYPE_OF(A,MOLD)
SAME_TYPE_AS(A,B)

ここで指定される引数は拡張可能型のオブジェクトでなければなりません(多相である必要はありません)。 SAME_TYPE_ASAB が同じ動的な型を持っている場合 にのみ .TRUE. を返します。 EXTENDS_TYPE_OFA の動的な型が MOLD の動的な型と同 じ、もしくはその拡張である場合にのみ .TRUE. を返します。 MOLD が割付けられていない無限多相(CLASS(*))であった場合には、 A の状態に関わりなく結果は真となります。

引数は割付けられていない状態もしくは遊離状態であっても問題ありませんが結合状態が未定義なポインタは許されません。

可能である場合にはこれらの組込み関数はなるべく使用せずに SELECT TYPE を使用することが推奨されます。

Results matter. Trust NAG.
Privacy Policy | Trademarks