【问题标题】:Extension method or Inheritance?扩展方法还是继承?
【发布时间】:2012-07-27 13:46:51
【问题描述】:

我在WPF 应用程序中将ObservableCollection 用于DataBinding,我将集合绑定到DataGridsComboBoxes。由于需要,我需要根据条件从集合中删除对象,因此我使用Extension method 实现了RemoveAll 功能,例如List

This 帖子指定了 Inheritance 优于 Extension methods 的一些优点,但对于我的情况并不是很具体,因为这是我需要添加的唯一方法,我不打算再添加一个 Extension method集合。

我想知道将其实现为Extension method 是否会更好,或者我是否应该考虑继承该类并将其添加为Instance method

另外,我想知道两者之间是否有任何性能差异,因为在提到的帖子中没有讨论过。

【问题讨论】:

  • 考虑使用 Clear 作为名称,因为这以删除列表中的所有内容而闻名。另一点是编译器将使用 Clear 的对象实现(如果可用)(通常性能更好)。
  • 好吧,Clear() 会删除所有内容,这不是我的意思。
  • 啊,我忘记了 RemoveAll 使用了谓词-Delegate......对不起!你说得对
  • 是的,确实如此,这就是为什么我不得不求助于 Extension 方法,因为 ObservableCollection 没有这种方法。

标签: .net wpf observablecollection


【解决方案1】:

如果您计划仅增强 ObservableCollection 而不仅仅是 RemoveAll(),则将其子类化并添加您的功能。如果您想将 RemoveAll() 添加到不仅仅是 ObservableCollection,那么您可以创建一个扩展方法来处理不仅仅是 ObservableCollections,而是通过在层次结构中定位 IEnumerable 或另一个通用父级。在该方法中,您可以测试该集合是否支持 CollectionChanged,并对其进行适当处理。

这里没有正确或错误的答案,只要适合您的需求即可。

【讨论】:

  • 好吧,正如我所指定的,我不打算添加任何其他功能,并且当我不需要进行任何绑定并且已经有方法时,我确实经常使用 IList,我不'认为我不需要将其扩展到任何其他类型。但好点(+1),我将来可能会使用这个建议。
【解决方案2】:

为了一种方法,我会使用扩展方法。在这种情况下,这意味着您的代码可以继续使用ObservableCollection<T>,而无需维护自定义类型。

扩展方法在编译时简单地归结为静态方法调用,所以我无法想象性能比继承更差。如果有的话,它应该是相同的或更好的。

个人偏好通常是决定扩展方法选择的因素。

【讨论】:

  • 谢谢。这回答了我的问题。 +1。
【解决方案3】:

使用扩展方法,您可以扩展接口,从而扩展该接口的每个实现者。

我会使用System.Collections.IList 的扩展方法来做到这一点。 System.Collections.IList 到处都在使用...

public class static Extension
{
   public static void RemoveAll(this System.Collections.IList list)
   {
      ...
   }
}

这将扩展几乎所有集合实现。

【讨论】:

  • 嗯,这看起来不错,但我想我现在不需要将此功能扩展到其他类型。但是一个很好的建议。 +1。
猜你喜欢
  • 2017-03-16
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 2012-09-03
相关资源
最近更新 更多