是否可以在Fortran 2003中模拟混合的抽象/延迟和常规过程?

是否可以在Fortran 2003中模拟混合的抽象/延迟和常规过程?,fortran,abstract-data-type,Fortran,Abstract Data Type,当我试图将常规过程和延迟过程混合在一种抽象类型中时,gfortran会拒绝调用任何常规过程: “错误:(1)处类型绑定过程调用的基对象为抽象类型'tbody'” 有没有办法安排类型tBody,这样我就可以同时拥有抽象的、延迟的过程和常规的、实例化的过程 有一个简单的解决方案-将调用此%t正文%init(…)替换为调用新正文(…)(您可能需要进行适当的可访问性更改) 可能是很弱的合理化——您没有根据引用的类型来解析过程(因为这是硬编码的),所以不要使用类型绑定过程语法 在某些情况下,另一种解决方案

当我试图将常规过程和延迟过程混合在一种抽象类型中时,gfortran会拒绝调用任何常规过程: “错误:(1)处类型绑定过程调用的基对象为抽象类型'tbody'”

有没有办法安排类型tBody,这样我就可以同时拥有抽象的、延迟的过程和常规的、实例化的过程

有一个简单的解决方案-将
调用此%t正文%init(…)
替换为
调用新正文(…)
(您可能需要进行适当的可访问性更改)

可能是很弱的合理化——您没有根据引用的类型来解析过程(因为这是硬编码的),所以不要使用类型绑定过程语法


在某些情况下,另一种解决方案是进一步拆分类型层次结构,以便抽象类型tBody有一个非抽象父级,承载“not deferred”过程的初始实现。

谢谢。我更喜欢第二种选择。第一种选择显然只能通过将新的_体公开为公共,使其不再受类型限制来实现。这可能会在以后的维护过程中造成太多的麻烦。但是请注意“薄弱的合理化”-这个%tBody%绑定,无论如何都不做类型绑定的事情。(下面可能有错误的理解…)此%tBody的declare和dynamic类型都是tBody类型,而不是扩展类型(这对第二个选项也有影响)。(从某种意义上说,您正在创建抽象类型的非多态对象——这就是语法规则阻止您的原因——这样的绑定可能不“存在”)。因为您已经指定了动态类型,所以您已经有效地指定了特定的过程,只是使用了不同的语法。您的示例代码中有一些不清楚的地方(但我假设),我假设newCuboid是一个覆盖tCuboid类型中绑定init的子例程,因此显然
调用此%init(…)
会再次出现。如果是这样的话,那么在示例代码中显式地使用它可能是一个好主意。
    type, abstract  :: tBody
private
  ...
contains
  procedure                     :: init => new_Body
  ...
  procedure (contained), deferred   :: PointIn
end type tBody
abstract interface
  logical(LGT) pure function contained( Body, Point )
    import  :: tBody, tAffinePoint, LGT
    class(tBody), intent(IN)        :: Body
    type(tAffinePoint), intent(IN)  :: Point
  end function contained
end interface

subroutine newCuboid(  this, ... )
class(tCuboid), intent(OUT)     :: this
...

call this%tBody%init( ... )
....    [gfortran halts here]

end subroutine newCuboid