我正在编写一个访问图像并读取像素值的模块。图像中的值通常具有不同的数据类型(integer(2)
,integer(4)
,...)。到目前为止,类型image
的定义方式如下:
type, public :: image
logical :: initialized = .false.
character(256) :: path = "" ! Path to image
integer :: dimensions(3) = -1 ! Dimensions of image
integer :: datatype = 0 ! Datatype
contains
procedure :: initialize
procedure :: pxvalues
procedure :: getMeta
end type image
我现在的问题:程序是否有可能根据图像的数据类型(存储在变量image%datatype
中)自动找到相应的程序?例如。如果数据类型是整数,则在执行pxvalues_integer
期间调用子例程image%pxvalues
。
谢谢!
答案 0 :(得分:2)
如果您不愿意更改代码的结构,那么bdforbes提出的SELECT CASE方法是一个选项。
除此之外,您可以使用多态并使用不同类型替换数据类型组件,这些类型都是相同父类型的扩展。这是存在类型绑定过程(类型定义中包含之后的过程语句)的根本原因,因此您也可以按预期使用它们!
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)
这种方法的含义需要更多的代码知识,而不是单独的示例代码段。
答案 1 :(得分:1)
如何实现这样的实际程序pxvalues
:
subroutine pxvalues(this)
select case (this%datatype)
case (0)
call this%pxvalues_integer
case (1)
call this%pxvalues_real
end select
end subroutine
答案 2 :(得分:0)
如果pxvalues是使用接口定义的模块过程,则可以执行以下操作:
interface pxvalues ; module procedure &
pxvalues_integer , &
pxvalues_real
end interface