【问题标题】:Why not to allow in-place interface implementation in .NET?为什么不允许在 .NET 中实现就地接口?
【发布时间】:2011-08-18 03:13:15
【问题描述】:

要么我遗漏了某些东西,要么 .NET 不支持 Java 的功能。我希望能够避免仅仅为了实现一个小接口而创建一个小类。例如,LINQ 的 except 方法需要 IEqualityComparer。所以我不得不写一个实现接口的小类。但是在 Java 中,我可以简单地做一个 new IEqualityComparer() { //interface declarations } 并完成它。所以有什么问题?

这与这篇文章有些相关:

Can a C# anonymous class implement an interface?.

补充: 目前,我为EqualsGetHashCode 添加了覆盖。

【问题讨论】:

  • @djacobson 我认为这是一个不同的问题。OP 询问是否存在等效于匿名内部类的问题,而不是 C# 匿名类型功能是否可用于实现接口。微妙但不同。

标签: c# .net interface anonymous in-place


【解决方案1】:

简短的回答是这在 C# .Net 中不受支持

我不得不承认这听起来很简洁,但通常这并不是真正需要的。 Linq 中的比较方法似乎是个例外,大多数其他 Linq 方法都接受使用委托执行相同操作的重载,可以通过 lambda 表达式“就地”实现。

对于这个特定的例子,有一些博客文章有一个LambdaComparer(或类似的)的实现,可以让你做到这一点,尽管使用的语法不太优雅。示例见Pass a lambda expression in place of IComparer or IEqualityComparer or any single-method interface?

【讨论】:

  • 好吧,如果他们会给我Func 类型,就像在许多其他情况下一样,我会非常高兴的。 Except 似乎只是被忽视了,没有被爱 :)
【解决方案2】:

你是对的,C# 与 Java 不同,不支持可以实现接口的匿名内部类的概念。我遇到了与IEqualityComparer 完全相同的问题,最终得出了以下解决方案。

public static class Utils {
  private sealed class EqualityComparer<T> : IEqualityComparer<T> {
    private readonly Func<T, T, bool> m_equals;
    private readonly Func<T, int> m_getHashCode;
    internal EqualityComparer(
      Func<T, T, bool> equals,
      Func<T, int> getHashCode) {
      m_equals = equals;
      m_getHashCode = getHashCode;
    }
    public bool Equals(T left, T right) {
      return m_equals(left, right);
    }
    public int GetHashCode(T value) {
      return m_getHasheCode(value);
    }
  }

  public static IEqualityComparer<T> CreateEqualityComparer<T>(
    Func<T, T, bool> equals, 
    Func<T, int> getHashCode) {
    return new EqualityComparer<T>(equals, getHashCode);
  }
}

现在在我想要即时IEqualityComparer&lt;T&gt; 的地方我可以执行以下操作

var comparer = Utils.CreateEqualityComparer<Student>(
  (left, right) => left.Name == right.Name,
  value => value.Name.GetHashCode());

【讨论】:

  • 也可以覆盖 EqualsGetHashCode 方法。
  • @Schultz9999:JaredPar 的答案明确适用于您无法覆盖这些方法的情况:您不拥有该类,或者您有自己的平等定义。它们与您的问题适用的情况相同。
  • @Rick Sladkey:绝对。他的回答很棒。我拥有我的代码,所以我可以这样做。
猜你喜欢
  • 2012-12-26
  • 2016-10-06
  • 2016-04-27
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 2012-11-19
  • 2012-05-14
相关资源
最近更新 更多