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


123

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

例如,这可以实现以下目的:

  1. 创建一个ITopology接口

  2. 为此接口创建扩展方法(例如,公共静态int CountNodes(此ITopology topologyIf))

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

这样,实现接口的类不必具有设置的类名即可与扩展方法中定义的名称保持一致。

Answers:


188

他们当然可以;Linq的大部分内容都是围绕接口扩展方法构建的。

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

有关围绕构建的扩展方法的完整集合,请参见EnumerableIEnumerable<T>。要实现一个,与为一个类实现一个是相同的:

public static class TopologyExtensions
{
    public static void CountNodes(this ITopology topology)
    {
        // ...
    }
}

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


33
回复:“当然”-我想这个问题揭示了您暗中提到的建筑气味。如果您可以在接口上进行扩展,那么为什么接口不能包含已实现的方法?可以理解,要么接口应该能够具有具体的方法,要么一旦您知道它们不能做到,就认为不应将扩展方法视为可行的方法。(但是,它们是。不是在争论您的出色答案,只是在争论“当然”以及与IEnum的链接,而不是LINQ的链接;; ^ D)那里有些臭!
鲁芬

想要向@ruffin注释添加新闻,现在您可以向C#接口方法添加默认实现。来源:devblogs.microsoft.com/dotnet/...
Vinigas

@ruffin我发现这是C#中最令人困惑的架构决策。有时,它最终会变成混乱的半类半接口结构。不过,我认为从函数式编程的角度出发,并用于将实用程序引入接口而不是实现功能时,它将很有用。
Guney Ozsan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.