扩展方法可以应用于接口吗?

Gre*_*reg 115 .net c# extension-methods interface

是否可以将扩展方法应用于接口?(C#问题)

例如,这是为了实现以下目标:

  1. 创建ITopology界面

  2. 为此接口创建扩展方法(例如public static int CountNodes(this ITopology topologyIf))

  3. 然后在创建实现ITopology的类(例如MyGraph)时,它会自动拥有Count Nodes扩展.

这样,实现接口的类就不必具有与扩展方法中定义的类对齐的set类名.

Aar*_*ght 178

他们当然可以; Linq的大多数都是围绕接口扩展方法构建的.

接口实际上是扩展方法发展的驱动力之一; 由于它们无法实现任何自己的功能,因此扩展方法是将实际代码与接口定义相关联的最简单方法.

有关构建的整个扩展方法集合,请参阅EnumerableIEnumerable<T>.要实现一个,它与为类实现一个相同:

public static class TopologyExtensions
{
    public static void CountNodes(this ITopology topology)
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

就接口而言,扩展方法没有什么特别的不同; 扩展方法只是一个静态方法,编译器应用一些语法糖来使它看起来像方法是目标类型的一部分.

  • 回复:"当然" - 我认为这个问题揭示了你隐含提到的架构气味.如果您可以在接口上有扩展,为什么接口不能包含已实现的方法?认为接口应该能够具有具体方法,或者一旦你知道它们不能,就认为不应该允许扩展方法作为可行的方法,这是可以理解的.(但它们是.不是在争论你的优秀答案,只是"当然"和IEnum的链接,而不是[LINQ](https://github.com/dotnet/corefx/blob/master/src/System.Linq/ src/System/Linq/Contains.cs).; ^ D)那里有点臭! (27认同)
  • 想向 @ruffin 评论添加新闻,现在您可以向 C# 接口方法添加默认实现。来源:https://devblogs.microsoft.com/dotnet/default-implementations-in-interfaces/ (3认同)
  • @ruffin 我发现这是 C# 中最令人困惑的架构决策。有时它最终会导致半类半接口结构混乱。尽管如此,我相信从函数式编程的角度来看它是有用的,并且用于向接口引入实用程序而不是实现功能。 (2认同)