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