当基类实现抽象类时,在派生类上指定实现接口抽象

问题描述 投票:0回答:2

我想知道如果我在派生类上实现一个接口,如果基抽象类已经实现了抽象接口,是否有任何(运行时)差异:

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
有什么区别吗?

c# inheritance interface
2个回答
3
投票

考虑遵循您的示例。以下一定可以吗?

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()
的方法,正如我之前展示的,继承必须包括所有接口,因此无需再次声明。


3
投票

答案是。没有什么区别。

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
是多余的,因此没有必要。

© www.soinside.com 2019 - 2024. All rights reserved.