2010-05-05 54 views
78

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

即例如实现如下:

  1. 创建ITopology接口

  2. 创建此接口的扩展方法(例如公共静态INT CountNodes(这ITopology topologyIf ))

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

这样,实现接口的类将不必具有设置的类名称以与扩展方法中定义的内容对齐。

回答

136

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

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

请参阅Enumerable类,以获得围绕IEnumerable<T>构建的整个扩展方法集。要实现一个,这是同一个实现一类:

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

没有什么有关扩展方法的特别不同的,只要接口都在关注;扩展方法只是一种静态方法,编译器会应用一些语法糖来使其看起来像是目标类型的一部分。

+9

回复:“当然” - 我认为这个问题揭示了你隐含提及的建筑气味。如果你可以在接口上使用扩展,为什么接口不包含实现的方法?认为接口应该能够拥有具体的方法是可以理解的,或者一旦你知道它们不能,就认为扩展方法不应该被允许作为可行的kludge。 (但他们不会争辩你的优秀答案,只是“当然”和IEnum的链接,而不是[LINQ](https://github.com/dotnet/corefx/blob/master/src/System.Linq/ src/System/Linq/Contains.cs);^D)那里有臭味! – ruffin 2016-05-23 15:10:40

相关问题