简单来说,微软定义了一个
ReadOnlyCollectionBase
,但在 ReadOnlyCollection<T>
中并没有将其用作基类,尽管这听起来明显应该是这样的。
我有什么遗漏吗?我的意思是,有好的理由不将这个类作为基类吗?
ReadOnlyCollectionBase
,但在 ReadOnlyCollection<T>
中并没有将其用作基类,尽管这听起来明显应该是这样的。
我有什么遗漏吗?我的意思是,有好的理由不将这个类作为基类吗?
ICollection
,而ReadOnlyCollection<T>
是泛型的,并实现了ICollection<T>
。请注意,ICollection<T>
并不实现ICollection
。在这个主题上:
ICollection<T>
看起来像是ICollection
,但它实际上是一个非常不同的抽象。我们发现ICollection
并不是很有用。同时,我们没有一种表示读/写非索引集合的抽象。ICollection<T>
就是这样的抽象,你可以说ICollection
在泛型世界中没有确切相应的对等项;IEnumerable<T>
是最接近的。
来自同一篇文章:
ReadOnlyCollection<T>
是一个更好的ReadOnlyCollectionBase
。它位于System.Collections.ObjectModel
命名空间中。
从效果上讲,ReadOnlyCollection<T>
是泛型空间中的ReadOnlyCollectionBase
。
同样地,请注意,IList<T>
也不实现IList
。
总的来说,早期的非泛型类对于泛型类并不是有用的抽象(除了IEnumerable
的例外)。
ReadOnlyCollectionBase
。没有选择 ReadOnlyCollectionBase
的原因很简单——它不是泛型,而 ReadOnlyCollection<T>
的目的是要成为泛型。因此,它需要一个完全不同的继承树。*CollectionBase
类的目的是为了在 .net 1.1 中提供实现强类型集合的基础。随着泛型在 2.0 中的引入,它们变得过时了,但是仍然保留在框架中以实现向后兼容性。object
实例转换中派生。
IEnumerable
在原则上和IList
有相同的问题,但是相比于你需要为IList
编写的几十个方法(List<T>
和ReadOnlyCollection<T>
都实现了这些方法,与泛型集合接口分开实现),实现一个额外的方法(以及在枚举器上增加一个额外的属性)并不被认为是负担。 - Random832IList<T>
没有继承自ICollection
?因为后者基本上是IEnumerable
加上Count
,而且IList<T>
已经有了一个Count
方法,让IList<T>
继承ICollection
不需要实现者做更多的工作,但这样做可以让拥有IList<anything>
的人知道从枚举中可以期望多少项。 - supercat