如果我正在创建一个类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)
{...}
答案 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增加了很多好东西)。小心不要重新发明轮子。