inheritance - Fortran 2003/2008 中的 protected 继承

标签 inheritance fortran parent-child private

我正在寻找一种从后代类访问 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/

相关文章:

c# - 您可以将派生类添加到其基类列表中,然后从 C# 中的基类列表中调用派生类的方法吗

c++ - 当在 C++ 运行时确定精确形状时,如何将二维数组传递给外部函数?

fortran - 来自转置数组的源分配

arrays - Fortran:从矩阵中提取列和行并将它们用作乘法的一维数组

c - 如何知道给 exec 的命令是否存在?

actionscript-3 - 弹性 : Access static constant from parent

c++ - 两种方式包含类和模板实例

c++ - 我正在用 C++ 编写一个简单的继承程序,但出现了很多错误

java - 不添加 "@Override"的后果是什么?

java - 如何从 GSON 更改扩展类中属性的 @SerializedName