Der*_*Ape 6 c# inheritance interface
我想知道如果我在派生类上实现一个接口,如果基抽象类实现它已经是抽象的,是否有任何(运行时)差异:
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
}
}
Run Code Online (Sandbox Code Playgroud)
例如,当我检查实例是否在运行时实现接口等时,IFoo编写“实现”有什么区别吗?Derived
考虑遵循您的示例。下面的事情一定是可能的吗?
void f(Base b){
IFoo ifoo = b;
}
Run Code Online (Sandbox Code Playgroud)
因为对象 b 是 Base,所以它必须是 IFoo,因为 Base 实现了 IFoo。现在考虑以下事项。
var d = new Derived();
f(d);
Run Code Online (Sandbox Code Playgroud)
由于 d 是 Derived,因此它是 Base,因为衍生继承自 Base。因此,我们可以将其传递给 f,然后将其分配给 IFoo,就像我们之前所做的那样。
本质上,因为派生类仍然是其所有基类,所以它已经实现了其所有基类的接口。该语言的设计者承认这一点,并且无需重新声明派生类正在实现由其基类实现的接口。
我想您的问题可能是由于您实际放置方法主体的位置而产生的,但这确实不相关。接口的声明是该类型对象的其他使用者的契约。这些消费者并不关心方法体在哪里定义,他们只关心当他们有一个 IFoo 时,它有一个带有void Bar()可以调用的签名的方法,正如我之前展示的,继承必须包括所有接口,所以无需再次声明。