在我的项目中,我使用了非常复杂(和嵌套)的集合:
List<Pair<List<Pair<double>>, double>> myCollection
当我在项目的几个地方以同样的方式使用它时,我想将它转换为新类。但我有些疑惑......
处理此类集合的最佳方法是什么,创建内部字段并仅作为公共选定项目传递:
public class MyComplicatedCollection
{
private List<Pair<List<Pair<double>>, double>> myInnerCollection = null;
// Here come some constructors, data accessors etc... only to those elements which I would like to pass as public.
}
或者以其他方式,通过推导原始集合:
public class MyComplicatedCollection : List<Pair<List<Pair<double>>, double>>
{
// Here come some constructors,
// Most of the data accessors are given "out of the box"
}
第二种方式似乎更容易,但不像第一种方式那样安全。另一件事是性能 - 这些集合非常大,我需要快速访问它 - 这是至关重要的。
第二个问题:如果第二种方式更好......对于List
,有一个构造函数可以通过传递任何ICollection
来填充您的集合。有没有简单的方法为我的类创建这样的构造函数,或者我需要逐个元素(或使用AddRange
方法)填充我的集合元素?
答案 0 :(得分:2)
如有疑问,请使用成分。继承很难做到,只有当必须在新类型和基础/组合类型之间存在IS-A
关系时,才应该使用它。在这种情况下,我认为组合(即你的第一个例子)是最好的解决方案。
组合使您可以灵活地使用您想要的任何公共接口来构建您的类型。继承决定了你的接口,并在你的新类型和它的基类型之间创建了一个紧密耦合,这可能使未来的修改变得困难。
答案 1 :(得分:1)
与继承版本相比,包装集合将为您提供更好的控制,因此引入错误的机会更少。它还允许您隐藏或掩盖集合的复杂性。例如,您可以创建自己的访问者和属性。
在性能方面,你不会因为收藏而伤害自己。包装类实际上是一个非常薄的集合数据层,不应该影响性能。