我想知道如果我在派生类上实现一个接口(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
}
}
在 Derived
上编写“实现”IFoo
有什么不同吗?例如,当我检查一个实例是否在运行时实现接口(interface)等时?
最佳答案
考虑以下示例。必须满足以下条件吗?
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,就像我们之前所做的那样。
本质上,因为派生类仍然是它的所有基类,它已经实现了它所有基类的接口(interface)。该语言的设计者承认这一点,没有必要重新声明派生类正在实现由其基类实现的接口(interface)。
我想您的问题可能是因为您实际放置方法体的位置,但这实际上并不相关。接口(interface)的声明是该类型对象的其他消费者的契约。这些消费者不关心方法体在哪里定义,他们只关心当他们有一个 IFoo 时,它有一个可以调用的签名为 void Bar()
的方法,如我之前展示过,继承必须包括所有的接口(interface),所以没有必要再次声明它们。
关于c# - 基类实现抽象时在派生类中指定实现接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36568228/