【问题标题】:Data inheritance of subclass in Fortran 2003/2008Fortran 2003/2008 中子类的数据继承
【发布时间】:2013-05-18 03:26:11
【问题描述】:

在 Fortran 2003 中,如果在超类中将变量声明为 PRIVATE,则子类将无法访问它。但是如果所有变量都声明为PUBLIC,程序就会失去“信息隐藏”的属性。

有没有办法在 Fortran 面向对象编程中同时采用“数据继承”和“信息隐藏”?如果不是 2003 年,Fortran 2008 有什么改进吗?

【问题讨论】:

  • 在 Fortran 术语中,“超类”是“父 [派生] 类型”,子类是“扩展类型”。

标签: oop inheritance fortran information-hiding


【解决方案1】:

我的理解是,在 Fortran 2003 中,模块中定义的派生类型的任何私有组件都可以在该模块中直接访问。一个暗示(我没有测试过)是这些私有组件可以从同一个模块中定义的子类型直接访问,但不能从另一个模块中声明的子类型访问。正如我所说的,我没有对此进行测试,并且可以得到纠正。

如果您有一个实现子模块的编译器,那么私有组件也可以在后代子模块中直接访问。我认为子模块是在 2003 年标准发布后的技术报告中引入的,现在已包含在 2008 年标准中,但没有多少广泛使用的编译器实现了该功能。

尽管有这些标准,但我不清楚由于无法直接访问超类型的私有组件而损失了多少。在面向对象的世界中,将所有组件设为私有(尽管其他语言使用其他语言来表达这个想法)并仅通过访问器方法提供访问似乎很常见——在 Fortran 术语中,它们将是分配给或用于返回私有组件的值。这种内部数据表示与外部访问的严格分离允许在不改变其他过程访问数据的方式的情况下更改内部表示,并且这种分离通常被认为是一个好主意。

访问器过程的使用还允许访问控制的更细粒度和微妙的应用,例如通过提供一个过程来设置组件的值,当派生类型的实例被构造但没有过程来修改之后组件的值。

在我看来,具有公共访问器过程的私有组件提供了大部分数据继承信息隐藏,但我有兴趣阅读该问题的其他答案。

【讨论】:

  • 我测试了您第一段中所说的内容。你是对的。
  • 在另一个模块中声明一个子类型可能更有用,因为我们不想改变已经做的事情。例如,在一个 2-D 问题中,我声明了一个带有变量 x,y 的超类,然后我想将它扩展到一个带有新变量 z 的 3-D 子类。如果 z 与 x 和 y 无关,则一切正常。但是如果 z 必须与 x 和 y 交互,编码会有点麻烦,虽然,它仍然是可行的。我同意你所说的。这个设计其实是个好主意。我只是想知道是否有一种简单的方法可以解决我上面提到的问题。
  • 我认为避免严格使用访问器方法的简单方法是休假一年左右,然后在您最喜欢的编译器已更新以实现子模块时重新开始工作。要么,要么接受所有组件都应该是私有的并且只能由程序访问的理念。但是,说真的,我最近在 Fortran 中做了很多 o-o 编程,还没有遇到你认为是问题的问题。像你一样,我可以设想玩具情况,但实际上这还不是问题。
  • 我所描述的情况实际上正是我现在所面临的。那不是虚构的玩具。正如你所说,我认为我必须接受这个事实或等到子模块实现。
  • 在“典型”用例中(好吧,因为它可以考虑到实现的缺乏而典型 - 并且确实存在用例例外)这里的子模块只会帮助它们减小大小正确的模块中的源代码。 in 子模块中定义的类型将不可用于其他程序单元,除了该子模块的后代 - 即您的 3D 子类不能在任何其他模块中使用。那可能不适合。
【解决方案2】:

不幸的是,在 Fortran 中没有直接的方法来定义派生类型的组件,这些组件可以从扩展派生类型的类型绑定过程中访问,但在其他情况下隐藏。正如High Performance Mark pointed out,派生类型组件的访问是基于模块的:派生类型的私有组件只能从该模块内部访问。

实用的解决方案是定义所有应该可以从外部访问的公共内容,无论您是想仅在扩展派生类型还是在其他地方使用这些组件。在这个概念中,私有和公共仅决定您是否可以更改内部细节(私有)或不更改(公共),而不必担心对您或其他人代码的其他部分造成的后果。

另外,请注意,即使拥有像 C++ 中的受保护成员这样的语言特性,也不能解决基本问题:一旦您声明某些东西不是私有的,更改其行为将导致其他代码中的副作用,您最终甚至不知道(例如,有人扩展了您的派生类型并依赖于某些成员的行为可以从扩展类型中访问。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-19
    • 2023-03-27
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 2012-01-28
    • 1970-01-01
    相关资源
    最近更新 更多