“独占”继承:对某些形式的多重继承的要求

Posted

技术标签:

【中文标题】“独占”继承:对某些形式的多重继承的要求【英文标题】:"Exclusive" inheritance: requirement for certain forms of multiple inheritance 【发布时间】:2015-11-24 04:34:39 【问题描述】:

在 C++ 或 Java(或任何其他流行语言)中有没有办法限制哪些类可以扩展/继承给定的类?具体来说,是否可以在扩展某个类时强制执行特定的多重继承模式?

我将这篇文章命名为“独占继承”,因为这将构成一种继承形式,其中某些类将拥有扩展潜在超类的独占“特权”。

假设我们已经定义了以下类(为了简单起见,我将使用 extends 关键字,不受语言限制):

Visualizable
Timeable
Maskable
ExperimentalData

Trial extends ExperimentalData
TimeStampedData extends Timeable
PositionData extends Visualizable

两种情况:

    我们想定义一个新的类ShortPass,它继承自类Maskable,但我们希望以下是扩展Maskable的无效方式:

    ShortPass extends PositionData, Maskable
    

    应该使用以下内容

    ShortPass extends PositionData, Timeable, Maskable
    

    我们希望 TimeableVisualizable 的任何类都能够扩展 Maskable 而不是其他任何东西,以便以下内容有效:

    ShortPass extends PositionData, Maskable
    

    ShortPass extends TimeStampedData, Maskable
    

    但从来没有

    Trial extends Maskable
    ShortPass extends Visualizable, Timeable, Maskable
    

我知道解决方案 1 的一种方法是通过从 TimeableVisualizable 继承来定义 Maskable,但是如果方案 2 是这种情况(例如,程序规范需要一个类,比如 ShortPass , 要么是Visualizable 要么是Timeable 而不是两者(比如说,因为将ShortPass 定义为VisualizableTimeable 没有意义))?

【问题讨论】:

你为什么要这样做 【参考方案1】:

我可以想到两种方法:

我对此的第一个想法是将类声明为final,因此它根本不能用作超类。我想你已经知道了,所以继续我的第二个想法,

这仅适用于interfaces,但是实现另一个接口的接口可以工作(如果您希望接口 A 仅与另一个接口 B 一起实现)。然而,这引入了独立实现接口 B 的可能性。 (虽然你已经注意到了,只是说这确实是一个好方法)

【讨论】:

以上是关于“独占”继承:对某些形式的多重继承的要求的主要内容,如果未能解决你的问题,请参考以下文章

C++反汇编第四讲,认识多重继承,菱形继承的内存结构,以及反汇编中的表现形式.

Python 支持有限形式的多重继承。以啥方式限制?

QObject的多重继承

多继承 与 多重继承

C# 应该有多重继承吗? [关闭]

C++中的多重继承逻辑