Fortranでオブジェクト指向(1)
本日取り上げるポイント
Module, TYPE, TYPEの入れ子
サブルーチン・関数へのポインタ
MODULE facetMod
TYPE POINT
double precision x, y, z
END TYPE POINT
TYPE FACET
TYPE(POINT) pt(3)
CONTAINS
procedure :: print => print_facet
END TYPE FACET
CONTAINS
subroutine print_facet(this)
implicit none
! 処理
return
end subroutine print_facet
END MODULE facetMod
Moduleの宣言
MODULE [module name]
! 定義
END MODULE [module name]
で行います。
Fortran90以降で他のファイルに記述したプログラムから参照可能な記憶領域や
サブルーチン、関数を定義する場合にはModuleを使用します。
Moduleを使用せずにサブルーチンや関数を定義することもできますが、
その場合はプログラム全体から無条件に参照できるためカプセル化という点で
問題があります。
新しいFortranではCOMMON文による記憶領域の共有は(暗黙の?)非推奨になって
いますのでModuleの使用は必須となります。
Moduleで定義した記憶領域やサブルーチン、関数は
use [module name]
を指定したプログラムからのみ参照可能となり、カプセル化を実現できます。
TYPEの宣言
TYPE [type name]
! 定義
END TYPE [type name]
で行います。
オブジェクト指向プログラムの所謂クラスはFortranでは構造体とよばれ
TYPEとして宣言されます。上のプログラムでは倍精度実数型の値x, y, z
をもつPOINT構造体が宣言されています。
TYPEの入れ子
別のTYPEで定義した構造体を含む構造体を使用することが可能です。
上のプログラム例では3要素のPOINT構造体を配列としてもつFACET構造体
が定義されています。
サブルーチン・関数へのポインタ
TYPEにサブルーチン・関数を含める場合にはCONTAINS文を用いて
以降にサブルーチンや関数を記述します。
これを用いてメソッドと同等の処理機能を実装できます。
上の例では
procedure :: print => print_facet
を定義して、MODULE facetModに定義されたサブルーチンprint_facetを
printという名前で参照できるように定義しています。
以上で構造体の定義に関するごく基礎的なポイントの解説とします。
次回は定義した構造体の参照について説明します。