为什么接口支持多重继承,而类不支持c#

时间:2010-11-08 05:50:56

标签: c# class interface multiple-inheritance

  

可能重复:
  Why C# doen't support multiple inheritance
  Should C# include multiple inheritance?

我喜欢接口支持多重继承和类不支持

的原因

3 个答案:

答案 0 :(得分:8)

我宁愿'否定'你的陈述......“界面支持多重继承”。

接口实际上不是继承,它只是一个类所遵循的服务/行为的“契约”。

通过实现接口,类本身不会继承任何东西。

由于类/实体可以与多个契约(行为)绑定,我们可以在一个类中实现多个接口。

答案 1 :(得分:1)

因为这些在概念上是两个完全不同的东西。

如果从类继承,则继承基类的代码。 如果实现(不继承!)接口,则强制实现类具有一些预定义的方法/事件/属性签名。

虽然类的多重继承是错误和混淆的臭名昭着的源,但在类的继承列表中有许多接口是关于组合各种行为方面的,因此它是基于组件的编程的重要工具。

或者,换句话说:它是赞成组合而不是继承设计原则的实现。

托马斯

答案 2 :(得分:0)

我对一个更权威的答案非常感兴趣,但这是我的看法。

在支持多重继承的语言中,(可以说)不能令人满意地解决的关键歧义是当你从定义具有相同签名的方法的两种类型进行子类化时会发生什么。例如:

public class BaseClass1 
{
    public string SomeMethod() 
    {
        return "Implementation1";
    }
}

public class BaseClass2 
{
    public string SomeMethod() 
    {
        return "Implementation2";
    }
}

public class MySuclass : BaseClass1, BaseClass2 
{
}

现在返回以下内容是什么?

MySubclass mySubclass = new MySubclass();
string s = mySubclass.SomeMethod();

在C#中,显式接口实现允许您通过定义两者来轻松解决此问题。将BaseClass1BaseClass2转换为接口后,我们可以

public class MySuclass : IBaseClass1, IBaseClass2 
{
    string IBaseClass1.SomeMethod()
    {
        return "Implementation1";
    }

    string IBaseClass2.SomeMethod()
    {
        return "Implementation2";
    }
}

关键当然是这种语法没有歧义,因为如果没有先将目标投射到SomeMethodIBaseClass1,就无法访​​问IBaseClass2