2011-01-30 67 views
11

继承是C#中的传递关系吗?C#:传递继承

我问,因为我不明白为什么IList<T>实现ICollection<T>IEnumerable<T>ICollection<T>已经实现IEnumerable<T>

感谢澄清这对我来说。

+0

你可以找到在此类似[问题]一些答案[1] [1]:http://stackoverflow.com/questions/1164757/why-arraylist-implement-ilist-icollection-ienumerable – DesignFirst 2011-01-30 23:22:36

+0

http://stackoverflow.com/questions/4754923/a-question-about-interface-inheritance-in-net/4755044#4755044 – explorer 2011-01-31 04:35:09

回答

4

据我所知,它并没有真正不管你宣布IList<T>为:

public interface IList<T> : ICollection<T>, IEnumerable<T> { ... } 

或简称为:

public interface IList<T> : ICollection<T> { ... } 

想要实现IList<T>将必须实现的任何类所有这些接口,即也是继承的接口。很明显,如果你实现了这个接口而没有实现IEnumerable/IEnumerable<T>接口的GetEnumerator方法,你会得到一个编译器错误;示范的这个“证明”应该足以告诉你“接口继承”是可传递的,的确如此。


旁注1.在一个侧面说明(稍偏离主题),认为你也可以做到以下几点:

class Base 
{ 
    public void Foo() { ... } 
} 

interface IFoo 
{ 
    void Foo(); 
} 

class Derived : Base, IFoo 
{ } 

Derived并没有真正实现IFoo;其基类Base提供了方法Foo,但没有明确实施IFoo本身。

这很好编译,看起来是因为接口所需的所有方法都在那里。 (我会留在那里,现在就留下确切的技术性讨论。)

我提到这个看似不相关的现象的原因是我喜欢用这种方式来考虑接口继承:您需要实现类声明中指定的接口所需的所有方法。所以,当我看到

interface ICollection<T> : IEnumerable<T> { ... } 

而不是说,ICollection<T>继承IEnumerable<T>,我对自己说,ICollection<T>要求他们实施IEnumerable<T>,也都实现类的。”


旁注2。总结这个答案与另一个有点相关的轶事(我保证它会是最后一个):

前段时间我看频道9上的视频Inside .NET Rx and IObservable/IObserver in the BCL。正如你现在可能,这两个新的接口,即将从Rx,被引入到.NET 4的BCL中。一件奇怪的事情是,当你通过observable.Subscribe(observer)订阅观察者的观察者时,你所得到的只是一些匿名的IDisposable。为什么?

作为讲话者在视频解释,它们可以给所述IDisposable更具描述性的名称(如ISubscription),通过定义为类型名称“别名”如下:

interface ISubscription : IDisposable {} 

然而,他们最后决定反对这一点。他们认为,一旦ISubscriptionSubscribe方法返回,它将不再明显,返回的值需要是Dipose d。

所以这是另一个有点问题的“接口继承”方面,应该记住。

8

它在所有方面都是传递性的。可能您用来查看继承层次结构的工具有一定的显示方式。尽管您可以明确地实现它,但无法实现接口,因此无法实现它,从而将其从智能感知中隐藏起来。

作为IList的作者,您可以自由选择仅从ICollection派生或从ICollection派生和IEnumerable派生。在这种情况下,IEnumerable将是多余的,并由resharper标记。