我在想,为什么在某些情况下我会看到一个代表某种类型集合的类。
例如:
在Microsoft XNA Framework中:TextureCollection,TouchCollection等。 .NET框架本身的其他类,以Collection。结尾。
为什么这样设计?这样做有什么好处而不是像C#2.0中引入的泛型类型集合?
由于
答案 0 :(得分:3)
在.NET框架本身中,许多类型安全的集合早于2.0泛型,并且保持兼容性。
对于几个与XAML相关的上下文,没有语法来指定泛型类,或者语法很麻烦。因此,当List<T>
被使用时,会针对每个需求编写一个特定的TList
。
答案 1 :(得分:3)
你给出的例子很好。 TextureCollection是密封的,没有公共构造函数,只有内部构造函数。 TouchCollection实现IList<TouchLocation>
,类似于List<T>
实现IList<T>
的方式。仿制药在这里工作,顺便说一句,这个答案是不正确的。
TextureCollection被故意削弱,它确保你永远不能创建它的实例。只有关于纹理的秘密知识才能填充此集合,List&lt;&gt;这是不够的,因为它不能用使索引器工作的秘密知识初始化。类也不需要是通用的,它只知道Texture类实例。
TouchCollection同样专业。 Add()方法抛出NotSupportedException。这不能通过常规List&lt;&gt;来完成。 class,它的Add()方法不是虚拟的,所以不能重写抛出异常。
这并不罕见。
答案 2 :(得分:2)
它允许您在集合上定义自己的语义(您可能不希望使用Add
或AddRange
方法等...)。
此外,由于没有让您的代码遍布各处List<Touch>
和List<Texture>
,因此可读性会提高。
还有相当多的.NET 1.0 / 1.1代码仍然需要工作,因此仍然需要存在早于仿制药的旧集合。
答案 3 :(得分:1)
例如,在XAML中使用泛型类并不容易。
答案 4 :(得分:1)
根据Oded的回答,当您决定需要堆栈/队列等而不是List
时,您自己的类类型允许更容易地改变轨道。这可能有很多原因,包括性能,内存使用等。
事实上,隐藏这种类型的实现细节通常是个好主意 - 您的班级用户只想知道它存储Textures
,而不是如何存储。