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

ブログ

Fortranでオブジェクト指向

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のオブジェクト指向対応の経緯から少々不自然な仕様が
残っているのかと考えています。

今日はこの辺で。

 

関連記事