多くのタイプ(球、平面、NURBSサーフェス、stlファイルなど)のジオメトリを科学的なFortranコードにインポートするためのライブラリを作成しています。type :: geom
この種の問題は、aやthenなどを定義するのが簡単であるため、OOPにとってはテーラーメイドのようtype,extends(geom) :: analytic
です。私が問題を抱えているのはファイルIOです。
この時点での私の解決策は、形状を定義するパラメーターを作成することです。これには、形状を示すいくつかのフラグが含まれます。読むとき、私class(geom) :: object
は(それがどのサブタイプになるかを前もって知らないので)インスタンス化しますが、どうすればそれを読むことができますか?
サブタイプの特定のコンポーネントにアクセスできません。ダウンキャスティングは冗長であり、その上、新しいallocate(subtype :: class)
ものは機能していないようだと読みました。新しいREAD(FORMATTED)
ものはifortやgfortranによって実装されていないようです。すなわち
module geom_mod
type :: geom
end type
type,extends(geom) :: sphere
integer :: type
real(8) :: center(3),radius
contains
generic :: READ(FORMATTED)=> read_sphere ! not implemented anywhere
end type
contains
subroutine read_geom(object)
class(geom),intent(out),pointer :: object
integer :: type
read(10,*) object%type ! can't access the subtype data yet
read(10,*) type
backspace(10)
if(type==1) then
allocate(sphere :: object)! downcast?
read(10,*) object ! doesn't work
end if
end read_geom
end module
私はこれについてすべて間違っていますか?ポリモーフィズム以外のものを使用してこれをハックすることはできますが、これは他のすべての場所でよりクリーンに見えます。支援をいただければ幸いです。
編集:IanHのモジュールを使用したサンプルプログラム
program test
use geom_mod
implicit none
class(geom),allocatable :: object
open(10)
write(10,*) '1'
write(10,*) sphere(center=0,radius=1)
rewind(10)
call read(object) ! works !
end program test