如何使用“共享”策略解决oops中的钻石问题?

时间:2018-11-13 20:19:59

标签: oop diamond-problem primary-constructor

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

1 个答案:

答案 0 :(得分:1)

在Curl上引用https://en.wikipedia.org/wiki/Multiple_inheritance的Wikipedia 项目符号:

  

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

从这里开始,不知道Curl,仅带有上面的引号和this,并指出

  

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

给予

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

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

似乎必须声明A shared,并且在创建D时,B运行一个调用A(主要)构造函数的构造函数,C运行一个调用A(第二)构造函数的构造函数。主/辅助构造函数调用之间的区别是自动的,并且对编码人员是透明的。

在调用两个A构造函数时,会在内存中创建两个A对象,即A类与两个不同的子类共享,但是没有一个“共享” A对象,而是两个独立的对象(另请参见{ {3}}在某种程度上是相关的(C ++)。

对于我用几种不同语言阅读的内容来说,几乎总是用编码器消除了钻石问题的资格。语言只是定义了不同的或相似的方案来给出错误,或具有选择多个歧义定义之一的条件,例如继承链中的特定搜索顺序。其他一些语言甚至不允许多重继承,但是在其中一些语言中,您可以通过其他方式(例如接口)来扩展功能。