C# 为什么c中的接口支持多重继承而类不支持#
可能的重复项:C# 为什么c中的接口支持多重继承而类不支持#,c#,class,interface,multiple-inheritance,C#,Class,Interface,Multiple Inheritance,可能的重复项: 我想知道接口支持多重继承和类不支持的原因是什么,我对一个更权威的答案很感兴趣,但以下是我的看法 在支持多重继承的语言中,当您从两种类型(都定义了具有相同签名的方法)中生成子类时,会发生(可以说)无法令人满意地解决的关键歧义。例如: public class BaseClass1 { public string SomeMethod() { return "Implementation1"; } } public class Bas
我想知道接口支持多重继承和类不支持的原因是什么,我对一个更权威的答案很感兴趣,但以下是我的看法 在支持多重继承的语言中,当您从两种类型(都定义了具有相同签名的方法)中生成子类时,会发生(可以说)无法令人满意地解决的关键歧义。例如:
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#中,显式接口实现允许您通过定义两者来轻松解决这一问题。将BaseClass1
和BaseClass2
转换为接口后,我们可以
public class MySuclass : IBaseClass1, IBaseClass2
{
string IBaseClass1.SomeMethod()
{
return "Implementation1";
}
string IBaseClass2.SomeMethod()
{
return "Implementation2";
}
}
当然,关键是这种语法没有歧义,因为如果不先将目标转换为
IBaseClass1
或IBaseClass2
,就无法访问SomeMethod
,我宁愿“否定”你的陈述。。“接口支持多重继承”
接口实际上并不是继承,它只是类遵守的服务/行为的“契约”
通过实现接口,类本身不会继承任何内容
由于一个类/实体可以绑定多个契约(行为),我们可以在一个类中实现多个接口。因为这在概念上是两个完全不同的东西 如果从类继承,则继承基类的代码。 如果实现(而不是继承!)接口,则强制实现类具有一些预定义的方法/事件/属性签名 虽然类的多重继承是错误和混乱的臭名昭著的根源,但在类的继承列表中有许多接口是关于组合各种行为方面的,因此它是基于组件编程的重要工具 或者,换言之:它是优先组合而非继承设计原则的实现
Thomas与[为什么C#不支持多重继承]()相同。这是@Marc的一个dup,它本身是关闭的,但我并不真的同意。为什么它是这样设计的,以及它是否是正确的设计是不同的问题。@Matthew-我对这一个也有同样的想法,这就是为什么我没有关闭它;p(我也没有关闭另一个)我同意Matthew的观点,这不是dup,因为问题是为什么它支持接口而不支持类。这两个问题我都看不到答案,我认为这很有趣。