簡體   English   中英

當基類實現abtract時,在派生類上指定實現接口

[英]Specify implement interface on derived class when base class implements it 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,因為派生繼承自Base。 因此,我們可以將它傳遞給f,然后將其分配給IFoo,就像我們之前所做的那樣。

本質上,因為派生類仍然是它的所有基類,所以它已經實現了它的所有基類的接口。 該語言的設計者承認這一點,並且沒有必要重新聲明派生類正在實現由其基類實現的接口。

我想也許你的問題出現了,因為你實際放置了方法體,但這確實是不相關的。 接口的聲明是該類型對象的其他使用者的合同。 那些消費者並不關心定義方法體的位置,他們關心的只是當他們有一個IFoo時,它有一個帶有可以被調用的簽名void Bar()的方法,正如我之前所說,繼承必須包括所有接口,所以不需要再次聲明它們。

答案是否定的 沒有區別。

Class Derived繼承自BaseBase繼承自IFoo

因此,在定義Derived類時,沒有必要“實現” BaseIFoo

在定義類Base時建立層次結構:

public abstract class Base : IFoo

並在您定義Derived時繼續如下:

public abstract class Derived : Base


通過從Base類定義中刪除: IFoo實現重新定義Base類,從層次結構中“刪除” Base可能會出現唯一的問題,如下所示:

public abstract class Base


底線是: , IFoo是多余的,因此不是必需的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM