2008-11-01 63 views
6

我看到這樣的東西有很多的接口:重新實現另一個接口已經繼承

interface A { ... } 
interface B : A { ... } 
class C : B, A { ...} 

爲什麼你會指定是c實現接口A,B時已經繼承了阿? 它會產生任何語義差異還是隻是一種風格問題?

(這樣的例子很多是List<T>實施IList<T>ICollection<T>,同時也IList<T>ICollection<T>派生)。


更新:感謝確認我的猜測,它沒有任何語義差別。

我想出了一個相關的情況下它不會有所作爲明確命名的接口已在繼承樹:

如果B是類,C那隻(重新)如果在':'之後明確指定A,則實現接口成員A

[編輯]我改變了這個問題的措辭,以避免與顯式實現的接口成員混淆,這些接口成員將成員的使用限制在將對象轉換爲接口的情況下。

回答

11

我相信這只是一個風格問題。在查看框架/庫類時(例如,在您的示例中),它特別重要,它突出顯示了可以將此類視爲ICollection或IList的想法,而開發人員不必知道IList實際上是ICollection。

它沒有功能分支。具體而言,該代碼將編譯與否 類「C」工具「A」明確:

namespace DotNetInterfaceTest { 
    class Program { 
     static void Main(string[] args) { 
      A c = new C(); 
     } 
    } 

    interface A { 
     void foo(); 
    } 

    interface B : A { 
     void bar(); 
    } 

    class C : B { 
     public void bar() {} 
     public void foo() {} 
    } 
} 
+0

我認爲這是更好的可讀性..不必工作你的腦細胞通過該接口繼承層次。 – Gishu 2008-11-01 19:16:33