我想知道,如果在派生类上实现接口,如果基础抽象类实现了它,那么(运行时)是否有任何区别:
public interface IFoo
{
void Bar();
}
public abstract class Base : IFoo
{
public abstract void Bar();
}
public class Derived : Base, IFoo // does this make any difference?
{
public override void Bar()
{
// do something
}
}
在Derived
上写"实现"IFoo
有什么区别吗?例如,当我检查一个实例是否在运行时实现了接口等时。?
请考虑以下示例。以下必须是可能的吗?
void f(Base b){
IFoo ifoo = b;
}
因为对象b是Base,所以它必须是IFoo,因为Base实现了IFoo。现在考虑以下内容。
var d = new Derived();
f(d);
由于d是Derived,所以它是Base,因为Derived继承自Base。因此,我们可以将它传递给f,然后将它分配给IFoo,就像我们以前做的那样。
本质上,因为派生类仍然是它的所有基类,所以它已经实现了它所有基类的接口。该语言的设计者承认了这一点,并且没有必要重新声明派生类正在实现由其基类实现的接口。
我想,也许你的问题是因为你实际上把方法体放在了哪里,但这实际上并不相关。接口的声明是该类型对象的其他使用者的契约。这些使用者不关心方法体是在哪里定义的,他们关心的只是当他们有一个IFoo时,它有一个可以调用的签名为void Bar()
的方法,正如我之前所展示的,继承必须包括所有接口,所以没有必要再次声明它们。
答案是否。没有区别。
类Derived
继承自Base
,而Base
又继承自IFoo
。
因此,在定义类Derived
时,没有必要同时"实现"Base
和IFoo
。
层次结构是在定义类Base
:时建立的
public abstract class Base : IFoo
并在您将Derived
定义为以下时继续:
public abstract class Derived : Base
当您通过从Base
类定义中删除: IFoo
实现来重新定义Base
类,从而从层次结构中"删除"Base
时,唯一的问题可能会出现,如下所示:
public abstract class Base
底线是:, IFoo
是多余的,因此没有必要。