Fortranでオブジェクト指向(7)
今日のポイント TYPEとCLASSの違い
今日からまたオブジェクト指向の話題に戻ります。
FortranでCLASSを使う際の注意点等を紹介します。
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
CLASS(FACET), INTENT(INOUT) :: this
integer i
character(10), parameter :: header(3) = (/"1st point","2nd point","3rd point"/)
do i = 1, 3
write(6,'((a),3(f6.2,1x))') header(i), this%pt(i)%x, this%pt(i)%y, this%pt(i)%z
end do
return
end subroutine print_facet
END MODULE facetMod
CLASSはTYPEで定義する
TYPE FACET~END TYPE FACETでFACET構造体を定義しています。
この構造体を使用するprint_facetサブルーチンでは
CLASS(FACET), INTENT(INOUT) :: this
として引数thisを定義しています。TYPEで定義している構造体を
使用する際にCLASSとして変数定義に使用するのは少々不自然な感じもします。
但しFortranでは構造体定義としてのCLASSキーワードはないのでTYPEで定義します。
TYPEとCLASSの違い
もし上記のサンプルプログラムでthisの定義を
TYPE(FACET), INTENT(INOUT) :: this
で定義するとコンパイルエラーになります内容は
Error: Non-polymorphic passed-object dummy argument of 'print_facet' …
のように表示されます。これがTYPEとCLASSの本質的な違いともいえます。
つまり「TYPEで変数を定義するとあくまでも構造体変数」として定義されるのに対し、
FACET構造体は「変数以外のサブルーチンを内包しているので多様体つまりCLASS」
として定義する必要があるのです。
Fortranのオブジェクト指向対応の経緯から少々不自然な仕様が
残っているのかと考えています。
今日はこの辺で。