【问题标题】:How to use Private Inheritance aka C++ in C# and Why not it is present in C#如何在 C# 中使用 Private Inheritance aka C++ 以及为什么它不在 C# 中
【发布时间】:2011-12-31 13:54:30
【问题描述】:

我知道 C++ 支持私有继承,而 C# 只支持公共继承。我还看到一篇文章说私有继承通常定义了一个HAS-A关系和类之间的一种聚合关系。

编辑:用于私有继承的 C++ 代码: “Car has-a Engine”关系也可以使用私有继承来表示:

class Engine {
 public:
   Engine(int numCylinders);
   void start();                 // Starts this Engine
 };

class Car : private Engine {    // Car has-a Engine
 public:
   Car() : Engine(8) { }         // Initializes this Car with 8 cylinders
   using Engine::start;          // Start this Car by starting its Engine
 };

现在,有没有办法在 C# 类之间创建 HAS-A 关系,这是我想知道的事情之一 - 如何?

另一个奇怪的问题是为什么 C# 不支持私有(也是受保护的)继承? - 不支持多重实现继承是正当理由还是其他原因?

是否为未来的 C# 版本计划了私有(和受保护)继承?

在 C# 中支持私有(和受保护)继承是否会使其成为更好和更广泛使用的语言?

【问题讨论】:

  • 继承是NOT HAS-A 关系,它是并且一直是IS-A 关系。
  • @Als private Inheritance 是aggregation/has-a relationship的一种语法变体——本文:parashift.com/c++-faq-lite/private-inheritance.html
  • 好吧,当然 C# 已经支持 HAS-A 关系。您只需创建一个包含该其他类实例的私有/受保护成员变量,而不是扩展另一个类。 C++ 的私有/受保护继承的主要好处是它授予对其他类中受保护成员数据的访问权限。
  • Scott Meyers 建议您将私有继承视为“按条款实现”的关系。
  • @Als:但是私有继承不能真正被视为一种 is-a 关系,只有friends 是可见的。我总是将私有继承视为根据关系实现的。

标签: c# c++ inheritance aggregation private-inheritance


【解决方案1】:

现在,有没有办法在 C# 类之间创建 HAS-A 关系,这是我想知道的事情之一 - 如何?

使一个类具有另一个类的字段:

class Car
{
    Engine engine;
}

汽车有引​​擎。

另一个奇怪的问题是为什么 C# 不支持私有(也是受保护的)继承?

你的地下室有一个盒子。你从来没有把任何东西放进去。有人问你“为什么这个盒子是空的?”除了盒子是空的,因为没有人往里面放任何东西,你还能给出什么答案?

C# 不支持私有或受保护的继承,因为从来没有人实现过该功能并将其交付给客户。默认情况下,这些功能不是免费实现的。这不像我们以私有和受保护的继承开始 C#,然后出于某种充分的理由将它们取出。这些功能从一开始就不存在,不出所料,它们仍然不存在。功能不会自行发展。

不支持多重实现继承是正当理由还是其他原因?

我不明白这个问题。

是否为未来的 C# 版本计划了私有(和受保护)继承?

没有。

在 C# 中支持私有(和受保护)继承会使其成为比现在更好的语言吗?

我不这么认为。

我们通常在 OOP 中看到的继承的许多问题之一是,它将“是一种”语义关系与“重用”机制的实现细节完全混为一谈 关系。私有继承部分解决了这个问题。

在少数情况下,我真的希望在 C# 中拥有私有继承;最近的一个例子是我有一个通常可以构建的数据结构,但我不想向用户公开:

internal class FancyDataStructure<T> {...}

但只有在 T 为 int 时才可能序列化(原因与讨论无关。)我想说:

public class SerializableThingy : private FancyDataStructure<int>

相反,我只是将FancyDataStructure&lt;T&gt; 设为SerializableThingy嵌套类型,并使用组合而不是继承。需要编写少量的“管道”代码,但效果很好。

我认为添加该功能不会为自己付出代价;它增加了语言的复杂性,以换取避免一些微不足道的管道税的微小好处。

在 C# 中支持私有(和受保护)继承会使其成为比现在更广泛使用的语言吗?

我或其他任何人怎么可能知道这个问题的答案? StackOverflow 不适合提出需要基于反事实来预测未来的问题。我的建议:

  • 实现具有所需功能的 C# 版本。看看会不会流行。那你就知道了。
  • 找一个有超能力的人,如果现在情况不同,他可以预测未来会是怎样的。由于基于反事实的预测根据演绎逻辑规则自动为真,因此预测将是准确的。

【讨论】:

  • 它写在这篇 C++ 文章中:parashift.com/c++-faq-lite/private-inheritance.html 私有继承变体允许访问基类的受保护成员,我不确定是否可以使用包含类的实例字段解析在 C# 中的包含类中。你能解释一下这一点吗?
  • @Vijay:这很容易解决。如果 B 有一个受保护的字段 F,并且您想从包含 B 的 D 访问它,然后从 B 派生 C,让 C 公开 F,并让 D 包含一个 C。现在 D 可以看到 F,没问题。 “受保护”是用词不当;实际上没有什么是“保护”不受检查的。 “受保护”只是“公共”,上面覆盖着一层薄薄的单板。
  • 感谢@EricLippert,这是我的想法,但不确定,使用遏制暴露受保护..
【解决方案2】:

您会以正常方式创建 Has-a 关系:让一个类包含另一个类的实例成员。

在 C++ 中,有时会使用私有继承来表示已实现的关系,通常是为了简化对父方法/接口的访问。这可能是一种很少见的用途,我不会太担心 C# 不提供它,尤其是当组合提供相当相似的功能时。

【讨论】:

    猜你喜欢
    • 2021-10-28
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 2014-10-17
    • 1970-01-01
    相关资源
    最近更新 更多