当基类abtract实现派生类时,指定该派生类的实现接口



我想知道,如果在派生类上实现接口,如果基础抽象类实现了它,那么(运行时)是否有任何区别:

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时,没有必要同时"实现"BaseIFoo

层次结构是在定义类Base:时建立的

public abstract class Base : IFoo

并在您将Derived定义为以下时继续:

public abstract class Derived : Base


当您通过从Base类定义中删除: IFoo实现来重新定义Base类,从而从层次结构中"删除"Base时,唯一的问题可能会出现,如下所示:

public abstract class Base


底线是:, IFoo是多余的,因此没有必要。

最新更新