Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么c中的接口支持多重继承而类不支持#_C#_Class_Interface_Multiple Inheritance - Fatal编程技术网

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,因为问题是为什么它支持接口而不支持类。这两个问题我都看不到答案,我认为这很有趣。