簡體   English   中英

為什么一個接口要實現另一個接口?

[英]Why would an interface implement another interface?

我正在查看List<T>的聲明,發現它實現了IList<T>ICollection<T>IEnumerable<T> (以及其他)。

然后我去看看IList<T>的定義,發現它實現了ICollection<T>IEnumerable<T>

如果接口按照“合同”的方式工作並且我們沒有在其中編寫任何實際代碼,那么實現另一個接口的接口又有什么意義呢?

這種實施是累積性的嗎? 如果是,由於IList<T>實現ICollection<T>IEnumerable<T> ,因此List<T>不應僅實現IList<T>嗎?

抱歉,如果我的問題令人困惑,我現在有點困惑。

如果接口按照“合同”的方式工作並且我們沒有在其中編寫任何實際代碼,那么實現另一個接口的接口又有什么意義呢?

接口支持繼承,並以與類相同的方式促進多態性。 IList<T>也是ICollection<T> ,就像TextBoxControl

這種實施是累積性的嗎? 如果是這樣,由於IList實現ICollection和IEnumerable,因此List不應該僅實現IList嗎?

正如其他人指出的那樣,這主要是為了提高可讀性和可維護性。 是的,繼承是累積的。 但是,當類實現包含包含具有相同簽名的成員的多個接口時,只需要為所有實現定義一個成員。 顯式接口實現可用於為給定實現顯式定義成員。

至少它減少了冗余。

public interface INamedObject { string Name { get; } }
public interface IValuedObject<T> { T Value { get; } }
public interface INamedValuedObject<T> : INamedObject, IValuedObject<T> { }

比以下更好的設計:

public interface INamedObject { string Name { get; } }
public interface IValuedObject<T> { T Value { get; } }
public interface INamedValuedObject<T> {
   string Name { get; }
   T Value { get; }
}

另外,在后一種情況下,請注意, INamedValuedObject<T>現在既不是INamedObject也不是IValuedObject<T>

您可以將前一種情況讀為“作為INamedValuedObject<T>的東西是作為INamedObjectIValuedObject<T> ,並且還具有以下元素”。

暫無
暫無

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

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