代码之家  ›  专栏  ›  技术社区  ›  Gacek

复杂的集合已更改为类最佳处理方式

  •  1
  • Gacek  · 技术社区  · 14 年前

    在我的项目中,我使用了非常复杂(和嵌套)的集合:

    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 . 有没有简单的方法为我的类创建这样的构造函数,或者我需要逐个元素填充我的collection元素(或者使用 AddRange 方法?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Andrew Hare    14 年前

    有疑问时使用构图。继承是很难做对的,只有当你 必须 有一个 IS-A 新类型与基/复合类型之间的关系。在这种情况下,我认为构图(即你的第一个例子)是最好的解决方案。

    组合使您可以灵活地使用所需的任何公共接口构建类型。继承向您指示该接口,并在新类型与其基类型之间创建紧密耦合,这可能会使将来的修改变得困难。

        2
  •  1
  •   Paul Sasik    14 年前

    与继承的版本相比,包装集合将提供更好的控制,因此引入错误的机会更少。它还能让你隐藏或掩饰收藏的复杂性。例如,您可以创建自己的访问器和属性。

    从表现上看,包装这些收藏品不会对自己造成多大伤害。包装类实际上是集合数据上非常薄的一层,不应影响性能。