【问题标题】:Inheriting from List<myType> or Extending List<myType>从 List<myType> 继承或扩展 List<myType>
【发布时间】:2015-02-05 18:18:50
【问题描述】:

如果我正在创建一个类MyWrapper 来包装来自myClass 的对象List,那么MyWrapper 是否应该从List&lt;T&gt; 继承?还是List&lt;myClass&gt;

或者我应该为List&lt;myClass&gt; 创建一些扩展方法? 我知道从 List&lt;T&gt; 继承是违反准则的,但为什么呢?

List&lt;Point&gt;List&lt;T&gt; 继承有什么缺点吗?

List&lt;T&gt; 创建扩展方法有什么缺点吗?那么为List&lt;myType&gt; 创建扩展方法呢?

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

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

【问题讨论】:

  • 我可能会使用 List 的包装器。您的新课程不是列表。
  • List T 的扩展方法肯定有一个缺点。没有方法 MoveTo(Point ... 我投票继承的类
  • 如果您想更改数据结构,我更喜欢组合而不是继承。

标签: c# inheritance extension-methods


【解决方案1】:

您不能只向 List 添加扩展方法,因为您将无法编码为所有类型 T 的形状。如果它是 List&lt;People&gt; 怎么办?在这种情况下,“MoveTo”或“GetCenter”会做什么?

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

或者你可以只为你的“Point”类建模,然后有一个List&lt;Point&gt;,如果你想为List&lt;Point&gt;添加扩展方法,你可以这样做。

【讨论】:

    【解决方案2】:

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

    如果您想“按原样”提供 List 以及一些自定义方法,List 的扩展方法(您针对特定类型的“T”!)可能非常有用,并允许保留原始行为列表。

    用户仅在需要时启用和使用您的扩展方法。 缺点是扩展方法的明显缺点:你不能在它们中做任何你想做的事情。网络上有很多关于扩展方法的信息。

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

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

    【讨论】:

    • 声明的成员 List&lt;T&gt; 都不是 virtual,因此作为类型的用户,我确实知道您覆盖了哪些成员 - 没有他们。你可以隐藏其中的一些,但你不能覆盖any。 (您可以覆盖ToStringGetHashCode,因为object 将它们定义为virtual。)
    • 我提醒的不是很好,但我认为你是对的。所以我们可以问自己“重写一个我只能扩展的类是不是很好,特别是如果这个类如此庞大”
    • 我看不出班级的大小与这里有什么关系。
    • 嘿服务!感谢您使我的原始帖子清晰易读。我发表评论是因为我不知道如何发送私信。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多