如何在C#中使用私有继承又名C ++,为什么不在C#中使用它?

时间:2011-11-17 17:31:36

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

我知道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#中的私有(和受保护)继承会使它成为一种更好,使用更广泛的语言吗?

2 个答案:

答案 0 :(得分:14)

  

现在,有没有办法在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<T>成为SerializableThingy嵌套类型并使用了合成而不是继承。有一小部分“管道”代码要编写,但结果很好。

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

  

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

我怎么可能或者其他任何人可能知道这个问题的答案? StackOverflow是一个不好的地方,可以根据反事实来提出需要预测未来的问题。我的建议:

  • 使用您想要的功能实现C#版本。看它是否变得流行。然后你就会知道。
  • 如果现在情况有所不同,找一个有心灵能力的人可以预测未来将如何。由于基于反事实的预测通过演绎逻辑的规则自动,预测将是准确的。

答案 1 :(得分:1)

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

在C ++中,私有继承偶尔用于表示实现的关系,通常是为了简化访问父方法/接口。这可能是一个非常罕见的使用,我不会太担心C#不提供它,特别是当组合提供相当类似的功能时。