【问题标题】:Is it possible to emulate mixed abstract/deferred and regular procedures in Fortran 2003?是否可以在 Fortran 2003 中模拟混合的抽象/延迟和常规过程?
【发布时间】:2012-09-21 03:10:57
【问题描述】:

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

    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

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

【问题讨论】:

  • 您的示例代码中不清楚的地方(但我假设) - 我认为 newCuboid 是一个子例程,它覆盖了 tCuboid 类型中的绑定 init,因此明显的 call this%init( ... ) 会递归。如果是这种情况,那么在示例代码中明确说明可能是一个想法。

标签: fortran abstract-data-type


【解决方案1】:

没有。

有一个简单的解决方案 - 将 call this%tBody%init(...) 替换为 call new_Body(...)(您可能需要进行适当的可访问性更改)。

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

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

【讨论】:

  • 谢谢。我更喜欢第二种选择。第一个选项显然只能通过将 new_Body 公开为 PUBLIC 来完成,使其不再是类型绑定的。这可能会在以后的维护中造成太多的麻烦。
  • 但请注意“微弱的合理化”——this%tBody%binding,无论如何都不做类型绑定的东西。 (可能有错误的理解......) this%tBody 的声明类型和动态类型都是 tBody 类型,而不是扩展类型(这也对第二个选项有影响)。 (从某种意义上说,您正在创建一个抽象类型的非多态对象-这就是语法规则阻止您的原因-这种事物的绑定可能不“存在”)。因为您已经指定了动态类型,所以您已经有效地指定了特定的过程,只是使用了不同的语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 2019-12-27
相关资源
最近更新 更多