继承自List <mytype>或扩展列表<mytype> </mytype> </mytype>

时间:2015-02-05 18:18:51

标签: c# inheritance extension-methods

如果我正在创建一个类MyWrapper,要从myClass包装List个对象,那么MyWrapper是否应该从List<T>继承?或List<myClass>

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

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

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

对List有效的扩展方法的例子是

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

2 个答案:

答案 0 :(得分:2)

您无法向List添加扩展方法,因为您无法对所有类型的T形状进行编码。如果它是List<People>怎么办?什么会&#34; MoveTo&#34;或&#34; GetCenter&#34;在那种情况下呢?

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

或者你可以模拟你的&#34; Point&#34;类,然后有List<Point>,如果你想将扩展方法添加到List<Point>,你可以这样做。

答案 1 :(得分:0)

如果您选择派生List&lt;&gt;,最明显的缺点是您的用户无法“猜测”哪个方法被覆盖,哪些方法“按原样”提供。 List是非常丰富的类,特别是当使用LINQ扩展时,它的自定义覆盖很快就会产生误导和容易出错。

如果您希望按“原样”提供列表,使用一些自定义方法,列表的扩展方法(您将特定类型的“T”作为目标!)可能非常有用,并允许保留原始行为名单。

用户只有在需要时才会启用和使用您的扩展方法。 缺点是扩展方法的明显之处:你无法做到你想要的一切。关于扩展方法的网上有很多信息。

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

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

相关问题