2008-11-01 39 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