1. HOME
  2. ブログ
  3. Fortranでオブジェクト指向
  4. Fortranでオブジェクト指向(9)

ブログ

Fortranでオブジェクト指向

Fortranでオブジェクト指向(9)

本日のポイント 構造体の継承

2次元や3次元空間データを扱う場合に2次元で座標値2つ、3次元では3つになります。
この時、プログラム上の考え方は
1. 2次元の場合も3次元として扱って座標を保存する構造体を1つ定義する
2. 2次元と3次元では別のデータと考え、2つの構造体を定義する
のいずれかに加えて
3. 2次元データ構造体を継承した3次元データ構造体を定義する
があります。3.はオブジェクト指向ならではの考え方です。

サンプルプログラム

TYPE pt
  double precision x
  double precision y
END TYPE

TYPE, EXTENTDS(pt) :: pt_3d
  double precision z
END TYPE

継承はEXTENTDS属性を指定する

構造体の継承はEXTENTDS属性で継承する元の構造体名を指定します。
但し、流体解析などの場合は継承する方が良いか、構造体を入れ子に
するほうが良いか好みが分かれる場合もあります。
例えば各点の座標と物理量を保存する構造体を考えるとき
構造体の入れ子を使ったサンプル1と継承を使ったサンプル2が考えられます。
サンプル1の場合値へのアクセスはpt_val構造体型の配列をVALUE(:)とすると
VALUE(:)%point%x
VALUE(:)%value%u
のようにアクセスすることになります。サンプル2の場合
VALUE(:)%x
VALUE(:)%u
となります。プログラムは短い方が良いという大原則から言えばサンプル2が
よいと考えるケースもありますが、性質の異なる値がグルーピングされている
という論理的整合性を重視するならサンプル1を選ぶことになります。
いずれにしてもプログラムは書けますので好みで選ぶことになります。
(但し実行速度のシビアなチューニングが必要な場合では開発環境で
 決まる場合もあります。)

サンプル1
TYPE pt
  double precision x,y,z
END TYPE
TYPE val
  double precision u, v, w
END TYPE
TYPE pt_val
  TYPE(pt) point
  TYPE(val) value
END TYPE

サンプル2
TYPE pt
  double precision x,y,z
END TYPE
TYPE, EXTENDS(pt) pt_val
  double precision u, v, w
END TYPE

今日はこれまでにします。

関連記事