use*_*377 11 c# multiple-inheritance
继承是C#中的传递关系吗?
我问,因为我不明白为什么IList<T>器具ICollection<T>和IEnumerable<T>作为ICollection<T>已经实现IEnumerable<T>
谢谢你为我澄清这一点.
它在各方面都具有传递性.可能用于查看继承层次结构的工具有一定的显示方式.虽然您可以明确地实现它并从而将其隐藏在intellisense中,但是无法实现接口的实现.
作为IList的作者,您可以自由选择仅从ICollection或ICollection和IEnumerable派生.在这种情况下,IEnumerable将是多余的,并由resharper标记.
AFAIK,您是否声明IList<T>为:
public interface IList<T> : ICollection<T>, IEnumerable<T> { ... }
Run Code Online (Sandbox Code Playgroud)
或简单地为:
public interface IList<T> : ICollection<T> { ... }
Run Code Online (Sandbox Code Playgroud)
任何想要实现的类IList<T>都必须实现所有这些接口,即继承的接口。
显然,如果你实现了这个接口而不实现/接口的GetEnumerator方法,你会得到一个编译器错误;这个通过演示的“证明”应该足以告诉你“接口继承”确实是可传递的。IEnumerableIEnumerable<T>
旁注 1.在旁注中(稍微偏离主题),请考虑您还可以执行以下操作:
class Base
{
public void Foo() { ... }
}
interface IFoo
{
void Foo();
}
class Derived : Base, IFoo
{ }
Run Code Online (Sandbox Code Playgroud)
Derived实际上并没有实现IFoo;它的基类Base提供了 method Foo,但没有显式地实现IFoo它自己。
这编译得很好,似乎是因为接口所需的所有方法都在那里。(我将就此搁置,暂时将确切的技术讨论放在一边。)
之所以提到这个看似无关的现象,是因为我喜欢这样看待接口继承:你需要实现类声明中指定的接口所需要的所有方法。所以当我看到
interface ICollection<T> : IEnumerable<T> { ... }
Run Code Online (Sandbox Code Playgroud)
与其说“ICollection<T>继承IEnumerable<T>”,我可以对自己说,“还ICollection<T>需要他们实现的所有实现类IEnumerable<T>。”
旁注 2.用另一个有点相关的轶事来结束这个答案(我保证这将是最后一个):
前段时间我在第 9 频道上观看了视频Inside .NET Rx 和IObservable/ IObserverin the BCL。正如您现在可能看到的,这两个来自Rx 的新接口通过 .NET 4 被引入到 BCL。一件奇怪的事情是,当你通过观察者订阅观察者observable.Subscribe(observer),你得到的只是一些匿名的IDisposable。为什么?
正如演讲者在该视频中所解释的那样,他们可以通过定义如下的类型名称“别名”来给出IDisposable更具描述性的名称(例如ISubscription):
interface ISubscription : IDisposable {}
Run Code Online (Sandbox Code Playgroud)
然而,他们最终决定不这样做。他们认为一旦ISubscription从Subscribe方法中返回an ,返回值需要为Diposed就不再明显了。
所以这是人们应该记住的“接口继承”的另一个稍微有问题的方面。
| 归档时间: |
|
| 查看次数: |
1008 次 |
| 最近记录: |