C#中的继承概念

时间:2010-11-02 12:01:03

标签: c# multiple-inheritance

  

可能重复:
  Does C# support multiple inheritance?

C#是否支持多重继承?

8 个答案:

答案 0 :(得分:9)

C#不支持多重继承。它确实支持接口的多个实现(因此您的类可以使用尽可能多的接口,只有一个基类')

答案 1 :(得分:3)

简而言之,不支持多重继承。

这不是问题,因为继承应始终转换为“is-a”关系。对象通常只有一种。

另一方面,转换为“行为类似”关系的接口可以多次实现。

这不是限制,而是避免许多奇怪问题的优势,例如Diamond Problem

答案 2 :(得分:2)

没有。抱歉。它目前不支持多重继承。

答案 3 :(得分:2)

它不支持多重继承,希望它永远不会。摆脱这个错误源是远离C ++编程模型的主要步骤之一。

托马斯

答案 4 :(得分:1)

当您使用真实世界的示例进行概念化时,多重继承始终是一个令人毛骨悚然的概念。多重继承意味着多个父亲。对象在C#中是安全的,它们只属于一个父亲:)


在另一个威胁上,他们讨论了一些设计问题。您必须对此感兴趣:What is the exact problem with multiple inheritance?

答案 5 :(得分:1)

C#不支持多重继承。

但是如果你想从两个来源“继承”行为,为什么不使用组合:

  • 组合物

  • 依赖注入

有一个基本但重要的OOP原则可以说:“赞成组合而不是继承”。

你可以创建一个这样的类:

public class MySuperClass
{
    private IDependencyClass1 mDependency1;
    private IDependencyClass2 mDependency2;

    public MySuperClass(IDependencyClass1 dep1, IDependencyClass2 dep2)
    {
        mDependency1 = dep1;
        mDependency2 = dep2;
    }

    private void MySuperMethodThatDoesSomethingComplex()
    {
        string s = mDependency1.GetMessage();
        mDependency2.PrintMessage(s);
    }
}

正如您所见,通过构造函数注入了dependecies(接口的实际实现)。您的类不知道每个类是如何实现的,但它知道如何使用它们。因此,这里涉及的类之间存在松散的耦合,但具有相同的使用能力。

今天的趋势表明继承有点“过时”。

答案 6 :(得分:0)

我的2美分:正如已经说过的,C#不支持多重继承,也支持其他OO语言,如Java。主要原因是多继承带来的问题,例如使用super()构造函数,例如;很难评估所有可能的歧义 - super()来自哪个类?由于解决模糊性的方法,还存在性能问题。使用C ++发现的大多数问题都支持多继承,并且考虑到这一点,开发人员

正如Svisstack所说,使用接口。大多数时候是解决问题的最佳方法。根据经验,即使在C ++中,我也使用没有任何属性的抽象类来模拟接口。

PS:在我写这个答案的时候,jdehaan提出了我更详细的说法。

答案 7 :(得分:0)

虽然它不支持多重继承,但您可以通过接口和摘要推送多个实现。一个例子是创建车辆并基于车辆类型实现不同的界面。下面是一个非常伪的飞机和出租车的例子,它既实现了车辆类别,又实现了特定于车辆类型的界面,并包含特定于其行为的方法。

我输入方法调用的方式称为显式接口实现,并处理一个事件,其中车辆和其他接口都包含相同的方法。

interface IPlane
{
void CheckLanding();
void LandingGear();
void Turn();
}
interface IVehicle
{
void Gas();
void Brake();
void Turn();
}
interface ITaxi
{
void StartMeter();
void StopMeter();
)
public class Taxi: IVehicle, ITaxi
{
void ITaxi.StartMeter()
void IVehicle.Gas
void IVehicle.Brake
void ITaxi.StopMeter()
{
public class AirPlane: IVehicle, IPlane
{
void IVehicle.Gas()
void IVehicle.Turn()
void IPlane.LandingGear()
void IPlane.Turn()
void IPlane.CheckLanding()
void IPlane.Turn()
void IPlane.LandingGear()
void IVehicle.Brake()
void IVehicle.Turn()
}