元素数组中的多态性

时间:2015-06-29 01:26:21

标签: arrays fortran function-pointers

假设我已经定义了一个名为geometry的派生类型(在Fortran 2003中),并将其扩展为两个新的派生类型:circletriangle。每个扩展类型都有自己的构造函数NewCircleNewTriangle,它们分别返回circle个对象和triangle个对象。

然后我想这样做:

use appropriate_module
class(geometry), allocatable :: Geo(:)
allocate(Geo(2))
Geo(1) = NewCircle
Geo(2) = NewTriangle

当然,最后两行在Fortran 2003标准中无效。 我不想创建一个封装在派生类型中的指针数组来链接不同类型的对象,因为在数组中链接之前需要创建对象。在上述(假设的)情况下,将立即创建对象并将其存储在数组中。

是否有任何建议,或者是语言的限制?

1 个答案:

答案 0 :(得分:1)

如果需要值语义,请使用多态可分配组件创建派生类型数组。

use appropriate_module
type geometry_element
  class(geometry), allocatable :: item
end type geometry_element

type(geometry_element), allocatable :: geo(:)
geo = [ geometry_element(NewCircle()),  &
        geometry_element(NewTriangle()) ]

如果使用可分配参数(而不是通过函数结果)将新的geometry对象传递回调用作用域,则MOVE_ALLOC内在函数提供了一种将构造值移入数组的一个元素。