为什么接口不能继承纯抽象类

时间:2014-04-17 11:30:25

标签: c# .net interface abstract-class

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

interface A
{
    void DoWorkA()
    { }
}

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

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

public class ABC : B
{
    public void DoWorkB()
    {
        //do some work
    }

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

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

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

为什么这是不可能的。

5 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:5)

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

抽象类,可以包含实现:

//PERFECTLY VALID ABSTRACT CLASS DEFINITION
public abstract class A {

    public abstract void Overridable(); //ABSRTACT

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

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

答案 2 :(得分:3)

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

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

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

如果从继承另一个类的接口继承一个类,接下来会发生什么?如果在类中继承了所有.net语言中禁止的多个接口,则可以进行多重继承。

答案 3 :(得分:1)

  1. 根据我的知识,如果你继承接口中的抽象类(实际上你不能这样做),那么抽象类中的所有抽象方法都必须被覆盖。但是你不能提供功能(定义)对于接口中的方法,这是一个原因。

  2. 如果你继承了现有对象的属性(接口是现有类的所有成员(甚至是功能)),那么在接口中不继承普通类的另一个原因是:接口不支持。

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

  4. 如果现有的类继承了另一个类,那么接口继承了c#不支持的两个子类(可能包含相同的方法名)。

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

答案 4 :(得分:0)

从理论上讲,你可以设计一种可以实现这一目标的语言。 C#的设计者选择遵循OOP的通用约定,其中类不暗示接口,因此不能继承。