【问题标题】:How diamond problem in oops is solved using "shared" strategy?如何使用“共享”策略解决 oops 中的钻石问题?
【发布时间】:2018-11-13 20:19:58
【问题描述】:

在某些 OOPS 语言(例如 curl)中,通过将重复继承的类设置为“共享”来处理钻石问题?我想知道这是如何工作的。另外,我想知道在使用共享策略时,主构造函数和辅助构造函数在解决这些 OOPS 语言中的菱形问题中所起的作用。 假设有4个类,分别是A,B,C和D。假设继承结构是B,C继承A,D继承B和C。每个类都有一个变量,比如A有a,B有b,C有c和D 有 d。每个类如何创建对象?

【问题讨论】:

  • 为什么用curl标记?
  • 这是 oops 语言 curl 中的格式
  • 我关心的不是卷曲。我想知道“共享”策略是如何解决钻石问题的?
  • @user1067003 - 这是 oops 语言 curl 中的格式。我关心的不是卷曲。我想知道“共享”策略是如何解决钻石问题的?
  • @hanshenrik 这可能被标记为 curl 因为 OP 引用了维基百科 here 或维基百科作者指的是与 OP 相同的来源(或引用它)。

标签: oop diamond-problem primary-constructor


【解决方案1】:

在 Curl 的 https://en.wikipedia.org/wiki/Multiple_inheritance 引用维基百科 项目符号:

Curl 只允许明确标记为共享的类 反复继承。共享类必须定义一个次要的 类中每个常规构造函数的构造函数。常规的 第一次调用构造函数,共享类的状态为 通过子类构造函数初始化,次要 将为所有其他子类调用构造函数。

从这里开始,在不知道 Curl 的情况下,仅使用上面的引用和 this,其中声明

Curl 的对象语义类似于 Java 和 C++。

给定

    A
   /  \
 B(A) C(A)
   \   /
   D(B,C)

我想(我不确定)当从 D(B,C) 子类调用父构造函数时,编码员负责通过指定要运行的构造函数的限定名称来消除歧义。

看起来 A 必须声明为shared,并且当 D 被创建时,B 运行一个调用 A(主)构造函数的构造函数,C 运行一个调用 A(辅助)构造函数的构造函数。主/次构造函数调用之间的区别是自动的并且对编码器是透明的。

由于调用了两个 A 构造函数,在内存中创建了两个 A 对象,即 A 类与两个不同的子类共享,但是没有一个“共享”的 A 对象,而是两个独立的对象(另见@ 987654323@ 有点相关(C++)。)

就我所阅读的几种不同语言的内容而言,几乎总是编码人员能够消除菱形问题与资格的歧义。语言只是定义了不同或相似的给出错误的方案,或者有一个标准来选择多个模棱两可的定义之一,比如继承链中的特定搜索顺序。其他一些语言甚至不允许多重继承,但在其中一些语言中,您可以通过其他方式(如接口)扩展功能。

【讨论】:

  • 所以通过类D实例化时没有单个共享A的对象,可能该策略与C++的非虚拟策略相同。谢谢你的解释。至少现在我对这个策略有了一些想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 2022-07-20
相关资源
最近更新 更多