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的公共约定,在这种约定中,类不意味着接口,因此不能作为接口继承。