我正在寻找一种从后代类访问 Fortran 类(Fortran 术语中的派生类型)的私有(private)组件的方法。例如,假设类 A 有一个组件 x,它被声明为私有(private)。现在考虑第二个类 B,它继承自基类 A。在这种情况下,类 B 不能直接访问 x,因此不允许任何尝试访问 B%x。我能想到的两个解决方案是:
(1) 将 x 声明为公开的。然而,这将使 x 全局可访问,这会滥用数据隐藏,因此它被拒绝作为问题的可接受解决方案。
(2) 实现获取/设置A%x的过程,如A%getX()和A%setX()。这不仅麻烦,而且还允许(间接)在程序中的任何地方访问 A%x - 不仅在子类中。
我想要的是一种从 A 的子类访问 A%x 的方法,但否则 x 在其他地方应该是无法访问的。 C++ 具有用于此目的的“ protected ”属性,但据我所知,Fortran 2003 中的“ protected ”属性具有不同的含义(它使 A%x 可以在任何地方访问,并且只保护其值,不能在类之外更改)。
最佳答案
该语言没有一般意义上的这种能力(除了高性能标记建议的在一个模块方法中做所有事情),而且你并不是唯一一个想要这个的人。
正如您在 Mark's answer 的评论中所指出的,可访问性基于模块,而不是类型。
但请注意,使用子模块可能会部分解决您的问题。您使用 HIgh Performance Mark 建议的一种大模块方法,但该模块可以拆分为多个程序单元。实现类型绑定(bind)的过程可以在子模块中作为单独的模块过程一起提供,然后模块本身只保存类型定义和单独的接口(interface)主体。因为子模块在概念上是其祖先模块的一部分,所以模块中私有(private)的任何组件和类型仍然可以访问。
Fortran 和其他语言(例如 C++)之间的一个概念区别是,实际执行操作的过程不是类型的“一部分”——相反,类型具有引用过程的绑定(bind)。来自多种类型的绑定(bind)可以引用回一个过程。因此,虽然在类型定义内部,您是否在作为父类型扩展的范围内工作是很清楚的,但在类型定义之外则不太清楚。实现此功能的语言工具需要以某种方式适应这种差异。
关于inheritance - Fortran 2003/2008 中的 protected 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19837888/