[英]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>
,就像TextBox
是Control
。
這種實施是累積性的嗎? 如果是這樣,由於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>
的東西是作為INamedObject
, IValuedObject<T>
,並且還具有以下元素”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.