简单地说,微软定义了一个ReadOnlyCollectionBase
,但是当ReadOnlyCollection<T>
清楚地说这应该是这样的时候,它没有用它作为基类。
我在这里遗漏了什么吗?我的意思是,是否有充分的理由不使这个类成为基类?
答案 0 :(得分:21)
可能是因为它不是通用的并且实现了ICollection
而ReadOnlyCollection<T>
是通用的并且实现了ICollection<T>
。请注意,ICollection<T>
未实现ICollection
。在topic上:
ICollection<T>
似乎是ICollection
,但它实际上是一个非常不同的抽象。我们发现ICollection
不是很有用。同时,我们没有表示读/写非索引集合的抽象。ICollection<T>
是这样的抽象,你可以说ICollection
在通用世界中没有完全对应的对等体;IEnumerable<T>
是最接近的。
从同一篇文章:
ReadOnlyCollection<T>
要好得多ReadOnlyCollectionBase
。它在System.Collections.ObjectModel
命名空间中。
实际上,ReadOnlyCollection<T>
在泛型领域是ReadOnlyCollectionBase
。
同样请注意,IList<T>
未实现IList
。
通常,pre-generics类不能作为泛型类的有用抽象(IEnumerable
除外)。
答案 1 :(得分:5)
如果你看一下.net框架的历史,你会发现自2.0以来的泛型,但是ReadOnlyCollectionBase
已经在1.1中。不选择ReadOnlyCollectionBase
的原因很简单 - 它不是通用的,而ReadOnlyCollection<T>
的目标是通用的。因此它需要一个非常不同的继承树。
所有*CollectionBase
类的目的是为在.net 1.1中实现强类型集合提供基础。随着2.0中泛型的引入,它们已经过时,但仍处于向后兼容的框架中。
答案 2 :(得分:1)
如果他们这样做,可能会违反Liskov's Substitution Principle。
答案 3 :(得分:1)
从非泛型基类继承将是无效的。如果类型使用非泛型基础,那么它将是基础集合上方的一个薄层,其中通用特征将简单地从基础集合的基础object
实例中转换而来。
这会导致不必要的装箱/取消装箱值类型。使用泛型的一个好处是避免这种装箱/拆箱,这可能会对集合的性能产生不利影响。