[英]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
繼承自Base
和Base
繼承自IFoo
。
因此,在定義Derived
類時,沒有必要“實現” Base
和IFoo
。
在定義類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.