众所周知,接口可以继承另一个接口,接口只能包含方法签名。
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
}
}
那么为什么接口不能继承抽象类或普通类。
因此,如果接口继承了抽象类,则实现此接口的类需要提供抽象类的所有接口和抽象方法的实现。
为什么这是不可能的。
答案 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)
根据我的知识,如果你继承接口中的抽象类(实际上你不能这样做),那么抽象类中的所有抽象方法都必须被覆盖。但是你不能提供功能(定义)对于接口中的方法,这是一个原因。
如果你继承了现有对象的属性(接口是现有类的所有成员(甚至是功能)),那么在接口中不继承普通类的另一个原因是:接口不支持。
您不能在接口中创建构造函数或析构函数,但现有类包含最少的一个构造函数(如果不是编译器将创建它)。
如果现有的类继承了另一个类,那么接口继承了c#不支持的两个子类(可能包含相同的方法名)。
您将有更多理由支持接口中的继承。
答案 4 :(得分:0)
从理论上讲,你可以设计一种可以实现这一目标的语言。 C#的设计者选择遵循OOP的通用约定,其中类不暗示接口,因此不能继承。