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

在C中使用继承而不是名称别名是否正确?

  •  5
  • Trap  · 技术社区  · 16 年前

    换句话说,是否正确使用:

    public class CustomerList : System.Collections.Generic.List<Customer>
    {
        /// supposed to be empty
    }
    

    而不是:

    using CustomerList = System.Collections.Generic.List<Customer>
    

    我宁愿使用第一种方法,因为我只定义一次customer list,每次需要一个客户列表时,我总是使用相同的类型。另一方面,使用名称别名方法不仅迫使我必须在任何地方重新定义它,而且每次有人想要使用它时(想想一个大团队),都可能会给出不同的别名,从而导致代码的可读性降低。

    请注意,在这种情况下,目的永远不会是扩展类,而只是创建别名。

    9 回复  |  直到 11 年前
        1
  •  6
  •   Hallgrim    16 年前

    不要这样做。当人们阅读时:

    List<Customer> 
    

    他们立刻明白了。当他们读到:

    CustomerList
    

    他们必须去弄清楚客户列表是什么,这使得代码更难阅读。除非您是唯一一个使用代码库的人,否则编写可读代码是一个好主意。

        2
  •  11
  •   Ed Swangren    16 年前

    好吧,除非您要向基类添加一些功能,否则创建包装器对象是没有意义的。如果你真的需要的话,我会选择数字2,但是为什么不创建一个变量呢?

    List<Customer> customerList = new List<Customer>();
    
        3
  •  4
  •   Robert Paulson    16 年前

    我同意 以这种方式使用别名。您的团队中的任何人都不应该以呈现的方式使用别名;这不是提供别名的原因。另外,从泛型的工作方式来看,无论您在多少地方使用它,都只有一个列表类。

    除了声明和使用 List<Customer> 你最终会想把名单传给其他人。避免通过混凝土 列出<客户> 而是通过一个 IList<Customer> ICollection<Customer> 因为这将使这些方法更具弹性,更容易编程。

    将来的某一天,如果确实需要CustomerList集合类,则可以实现 iCollection<客户> ilist<客户> 并继续将其传递给那些方法,而不改变甚至不知道更好的方法。

        4
  •  3
  •   Greg Beech    16 年前

    实际上你也不应该使用。这个 correct approach according to the framework design guidelines is to either use or inherit from System.Collections.ObjectModel.Collection<T> 在公共API中(列表<t>仅用于内部实现)。

    但对于命名的特定问题,建议似乎是直接使用泛型类型名而不使用别名,除非需要向集合添加功能:

    从对象返回集合 提供标准平面的模型 香草系列API。

    返回集合的子类<t> 从对象模型提供 高级集合API。

        5
  •  3
  •   Catskul    11 年前

    使用继承进行别名/类型化设置时,存在要求重新定义相关构造函数的问题。

    因为在任何地方这样做都很快变得不合理,为了一致性,最好避免这样做。

        6
  •  1
  •   Brody    16 年前

    这是一个“视情况而定”的问题。

    如果您需要的是一个新的类,它除了满足您的其他需求外,还可以作为客户列表,那么继承就是方法。

    如果您只想使用客户列表,那么使用变量。

        7
  •  1
  •   Shog9    16 年前

    如果你只是想节省打字时间,那就用后者。这样你就不会碰到任何奇怪的继承问题。

    如果您真的想要公开一个逻辑上不同的集合类型,那么使用前者——您可以返回并向它添加一些东西。

    就我个人而言,我会用 List<Customer> 今天就到此为止。

        8
  •  1
  •   Dr8k    16 年前

    我基本上同意Ed。如果您不需要实际扩展泛型列表结构的功能,只需使用泛型列表:

    List<Customer> customerList = new List<Customer>();
    

    如果您确实需要扩展这个功能,那么通常您会看到继承。

    第三种可能性是,您需要从泛型列表构造中显著更改功能,在这种情况下,您可能只希望从IEnumerable继承功能。这样做可以使类在可枚举操作(如“foreach”)中可用,但允许您完全定义所有类行为。

        9
  •  1
  •   John Rudy    16 年前

    一个程序员在打字上的节省很可能是下一个程序员的维护噩梦。我要说的是,像这里很多人所说的,只要正确地输入通用的。它更清晰、更准确地描述了代码的意图,它将帮助维护程序员。(谁可能是你,六个月,四个新项目!)