我知道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#中的私有(和受保护)继承会使它成为一种更好,使用更广泛的语言吗?
答案 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是一个不好的地方,可以根据反事实来提出需要预测未来的问题。我的建议:
答案 1 :(得分:1)
您将以正常方式创建Has-a关系:让一个类包含另一个类的实例成员。
在C ++中,私有继承偶尔用于表示实现的关系,通常是为了简化访问父方法/接口。这可能是一个非常罕见的使用,我不会太担心C#不提供它,特别是当组合提供相当类似的功能时。