关于c#:为什么接口不能继承纯抽象类

Why interface cannot inherit pure abstract class

众所周知,一个接口可以继承另一个接口,而接口只能包含方法签名。

1
2
3
4
5
6
7
8
9
10
11
interface A
{
    void DoWorkA()
    { }
}

interface B : A
{
    void DoWorkB()
    { }
}

现在实现接口B的类需要提供两个函数体。

1
2
3
4
5
6
7
8
9
10
11
12
public class ABC : B
{
    public void DoWorkB()
    {
        //do some work
    }

    public void DoWorkA()
    {
        //do some work
    }
 }

所以为什么接口不能继承抽象类或普通类。

因此,如果接口继承了抽象类,那么实现该接口的类需要提供抽象类的所有接口和抽象方法的实现。

为什么这是不可能的。


接口和类之间的主要区别在于接口只提供签名,而不提供实现。如果继承类的接口继承了它的实现,那么它将提供实现,不再是接口。


因为接口是按语言定义的契约。它是描述契约的特定语言类型:因此您可以聚合不同的契约(从另一个接口继承一个接口),但契约本身不能扩展某些内容。

抽象类,可以包含实现:

1
2
3
4
5
6
7
8
9
//PERFECTLY VALID ABSTRACT CLASS DEFINITION
public abstract class A {

    public abstract void Overridable(); //ABSRTACT

    public void DoSomething() {
       //METHOD BODY
    }
}

因此,从语言设计和opp的角度来看,继承可能(并且通常)具有实现功能的接口是没有意义的。


因为不允许接口中定义任何方法或构造函数。

从类继承接口意味着它有一些方法和至少一个构造函数。即使没有在基类中定义构造函数,编译器仍然会生成一个构造函数。接口还需要一个构造函数来调用基本构造函数,这样您就违反了前面提到的规则。

根据具体情况,你可能会违反更多的规则。如果基类有一些方法或字段,接口也会继承它。

如果从继承另一个类的接口继承一个类,接下来会发生什么?如果继承一个类中的多个接口,则可以有多个继承,这在所有.NET语言中都是禁止的。


  • 据我所知,如果你在接口中继承抽象类(实际上你不能这样做),那么抽象类中的所有抽象方法都必须被重写。但是你不能为接口中的方法提供功能(定义),这是一个原因。

  • 在接口中不继承普通类的另一个原因是,如果您继承的任何类在意义上具有接口中不支持的现有对象的属性(接口是现有类的所有成员(甚至是功能)。

  • 不能在接口中创建构造函数或析构函数,但现有类至少包含一个构造函数(如果不是,编译器将创建它)。

  • 如果现有类继承了任何其他类,那么接口将继承两个子类,这两个子类在C中不受支持(可能包含相同的方法名)。

  • 您将有更多的理由支持接口中的继承。


    理论上,你可以设计一种语言来实现这一点。C的设计者选择遵循OOP的公共约定,在这种约定中,类不意味着接口,因此不能作为接口继承。