继承自 List<myType> 或扩展 List<myType>
Inheriting from List<myType> or Extending List<myType>
如果我正在创建 class、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)
{...}
您不能只向 List 添加扩展方法,因为您无法编码所有类型 T 的形状。如果它是 List<People>
怎么办?在那种情况下 "MoveTo" 或 "GetCenter" 会做什么?
是的,您应该创建一个新的 class 继承自 List,或者更好的是,IList。
或者你可以只为你的 "Point" class 建模,然后有一个 List<Point>
,如果你想向 List<Point>
添加扩展方法,你可以这样做。
如果您选择派生 List<>,最明显的缺点是您的用户无法 "guess" 覆盖哪些方法,提供哪些方法 "as is"。列表非常丰富 class,尤其是在使用 LINQ 扩展时,自定义覆盖它很快就会产生误导并容易出错。
如果您想提供带有一些自定义方法的列表 "as is",列表的扩展方法(您可以在其中定位特定类型的 "T"!)可能会很有帮助并允许保留 List 的原始行为。
用户只有在需要时才会启用和使用您的扩展方法。
缺点是扩展方法的明显缺点:您不能在其中做任何您想做的事情。网上有很多关于扩展方法的信息。
IHMO 最好的做法是将列表(或其他可枚举的)封装在您自己的 class 中。当然,T 特定于您自己的情况。
缺点是需要重新定义所有相关方法。当然,您也可以使用特定的 属性 公开内部列表(或者更好的是,它的只读副本)以允许用户直接使用它。您的 class 也可以实现 IEnumerable。
另请注意,已经有大量有用的重写和扩展方法以及完整的自定义集合实现来改进 Web 上的 List 和其他集合类型,以及 Framework 本身(大多数集合类型被滥用,LINQ 添加很多好东西)。注意不要重新发明轮子。
如果我正在创建 class、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)
{...}
您不能只向 List 添加扩展方法,因为您无法编码所有类型 T 的形状。如果它是 List<People>
怎么办?在那种情况下 "MoveTo" 或 "GetCenter" 会做什么?
是的,您应该创建一个新的 class 继承自 List,或者更好的是,IList。
或者你可以只为你的 "Point" class 建模,然后有一个 List<Point>
,如果你想向 List<Point>
添加扩展方法,你可以这样做。
如果您选择派生 List<>,最明显的缺点是您的用户无法 "guess" 覆盖哪些方法,提供哪些方法 "as is"。列表非常丰富 class,尤其是在使用 LINQ 扩展时,自定义覆盖它很快就会产生误导并容易出错。
如果您想提供带有一些自定义方法的列表 "as is",列表的扩展方法(您可以在其中定位特定类型的 "T"!)可能会很有帮助并允许保留 List 的原始行为。
用户只有在需要时才会启用和使用您的扩展方法。 缺点是扩展方法的明显缺点:您不能在其中做任何您想做的事情。网上有很多关于扩展方法的信息。
IHMO 最好的做法是将列表(或其他可枚举的)封装在您自己的 class 中。当然,T 特定于您自己的情况。 缺点是需要重新定义所有相关方法。当然,您也可以使用特定的 属性 公开内部列表(或者更好的是,它的只读副本)以允许用户直接使用它。您的 class 也可以实现 IEnumerable。
另请注意,已经有大量有用的重写和扩展方法以及完整的自定义集合实现来改进 Web 上的 List 和其他集合类型,以及 Framework 本身(大多数集合类型被滥用,LINQ 添加很多好东西)。注意不要重新发明轮子。