コードの構造を変更したくない場合は、bdforbesによって提案されたSELECTCASEアプローチがオプションです。
それを超えると、ポリモーフィズムを使用して、データ型コンポーネントを、すべて同じ親型の拡張である異なる型に置き換えることができる場合があります。これが、型にバインドされたプロシージャ(型定義のcontainsの後のプロシージャステートメント)が存在する根本的な理由です。したがって、意図したとおりに使用することをお勧めします。
type, public, abstract :: image
! Common components to all extensions
logical :: initialized = .false.
character(256) :: path = "" ! Path to image
integer :: dimensions(3) = -1 ! Dimensions of image
contains
procedure :: initialize
! Abstract interface pxvalues_image specified what the interface must
! look like. Deferred attribute means that extensions of image
! must specify a specific procedure for the pxvalues binding. All
! specific procedures must have the same interface bar the passed
! argument.
procedure(pxvalues_image), deferred :: pxvalues
procedure :: getMeta
end type image
abstract interface
subroutine pxvalues_image(obj, ...)
import :: image
class(image), intent(in) :: obj
...
end subroutine pxvalues_image
end interface
! A type for images that have integer2 data.
type, public, extends(image) :: image_integer2
contains
procedure :: pxvalues => pxvalues_integer2
end type image_integer2
! A type for images that have integer4 data.
type, public, extends(image) :: image_integer4
contains
procedure :: pxvalues => pxvalues_integer4
end type image_integer4
次に、特定のプロシージャ'' pxvalues_integer2''、'' pxvalues_integer4''などが、拡張タイプの初期引数を取ります。
データ型コンポーネントを設定するのではなく、最初の「画像」オブジェクトを作成するコードは、代わりに画像の適切な拡張子としてオブジェクトを作成する必要があります。
subroutine create_image(object)
class(image), intent(out), allocatable :: object
...
! We want an image that for integer2's
allocate(image_integer2 :: object)
このアプローチには、孤立したサンプルスニペットで提供できるよりも多くのコードの知識が必要な意味があります。