2015-02-05 84 views
1

如果我创建一个类,MyWrapper,包裹从MyClass的对象List,应该从List<T>MyWrapper继承?或者List<myClass>从列表<myType>继承或扩展列表<myType>

或者我应该只为List<myClass>创建一些扩展方法? 我知道这是违反从List<T>继承的指导性,但为什么?

List<Point>List<T>继承是否有任何缺点?

创建List<T>的扩展方法有什么缺点吗?那么为List<myType>创建扩展方法呢?

而对于一个扩展方法适用于列表中的一个例子是

public static void Swap<T>(this List<T> list, int firstIndex, int secondIndex) 
{...} 
+3

我可能会在列表中使用一个包装。你的新班级不是名单。 – 2015-02-05 18:26:30

+0

肯定有一个列表T的扩展方法的缺点。没有方法MoveTo(Point ...我投票类继承 – Paparazzi 2015-02-05 18:29:39

+1

如果你想改变数据结构,我宁愿组合继承。 – juharr 2015-02-05 18:38:52

回答

2

你不能只添加扩展方法列表,因为你将不能够编写所有类型的形状T.如果是List<People>会怎么样?在这种情况下,“MoveTo”或“GetCenter”会做什么?

是的,您应该创建一个从List继承的新类,或者更好的是IList。

或者你可以建立你的“Point”类,然后有List<Point>,如果你想扩展方法List<Point>你可以做到这一点。

0

如果您选择派生列表<>,最明显的缺点是您的用户无法“猜测”哪种方法被覆盖,哪些方法是“按原样”提供的。 List是非常丰富的类,尤其是当使用LINQ进行扩展时,并且它的一个自定义覆盖可能很快就会导致误导和bug。

如果你想提供List“as is”,有一些自定义的方法,列表扩展方法(在你的目标是你的特定类型的“T”!)可能是非常有用的,并允许保留原来的行为列表。

用户只有在需要时才会启用和使用您的扩展方法。 缺点是扩展方法中明显的缺点:你不能做任何你想要的东西。网上有很多关于扩展方法的信息。

IHMO最好的办法是将List(或其他可枚举)封装在你自己的类中。当然,T是针对你自己的情况的。 缺点是需要重新定义所有相关的方法。当然,你也可以使用特定属性公开内部列表(或者更好的是它的只读副本),以允许用户直接使用它。你的类也可以实现IEnumerable。

请注意,已经有大量有用的重写和扩展方法以及完全自定义的集合实现来改进Web上的List和其他集合类型,并且在Framework本身中(大多数集合类型被滥用,并且LINQ增加了一个很多好东西)。注意不要重新发明轮子。

+1

声明的成员'List '都不是'virtual',所以类型I *的用户可以*知道你重写了哪些 - *它们都不是*。你可以隐藏其中的一些,但是你不能覆盖任何*。 (你可以重载'ToString'和'GetHashCode',因为'object'虽然定义了它们'虚拟'。) – Servy 2015-02-05 18:44:46

+0

我没有提醒,但我认为你是对的。所以我们可以问自己“重写一个我只能扩展的类是否很好,尤其是如果这个类如此庞大” – AFract 2015-02-05 18:47:55

+1

我没有看到这个类的大小在这里如何相关。 – Servy 2015-02-05 18:48:37