c# - 基类实现抽象时在派生类中指定实现接口(interface)

标签 c# inheritance interface

我想知道如果我在派生类上实现一个接口(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/

相关文章:

c# - 无法使用 FormsAuthentication.SignOut() 从 ASP.NET MVC 应用程序注销

c# - 由于 Null 异常,.net core docker 容器在生产中退出并出现错误代码 139

c# - .NET 4.5.1 可以在 core2duo 处理器上运行吗?

java - java 中的继承有令人困惑的输出

javascript - JavaScript:对象继承自Function.prototype

c++ - 根据数据包类型更改行为,避免 switch 语句

java - 将调用接口(interface)实现的哪个对象方法

c# - 将点击事件附加到 GridView 中的图像上

c# - 为什么我们从接口(interface)而不是类创建对象实例?

json - 数组的元素之一作为对象