ChatGPT解决这个技术问题 Extra ChatGPT

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

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

例如,要实现以下目标:

创建一个 ITopology 接口为此接口创建一个扩展方法(例如 public static int CountNodes(this ITopology topologyIf) )然后在创建实现 ITopology 的类(例如 MyGraph)时,它将自动具有 Count Nodes 扩展。

这样,实现接口的类就不必有一个设置的类名来与扩展方法中定义的内容保持一致。


A
Aaronaught

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

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

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

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

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


回复:“当然” - 我认为这个问题揭示了你隐含提到的架构气味。如果您可以在接口上进行扩展,为什么接口不能包含已实现的方法?认为任何一个接口都应该能够具有具体方法是可以理解的,或者,一旦您知道它们不能,就认为不应允许扩展方法作为可行的组合。 (但他们是。不是在争论你的出色答案,只是“当然”和指向 IEnum 的链接,而不是 LINQ。;^D)那里有异味!
想在@ruffin 评论中添加新闻,现在您可以将默认实现添加到 C# 接口方法。来源:devblogs.microsoft.com/dotnet/…
@ruffin 我发现这是 C# 中最令人困惑的架构决策。有时它最终会导致混乱的半类半接口结构。尽管如此,我相信从函数式编程的角度来看它是有用的,并且用于将实用程序引入接口而不是实现功能。
@ruffin 还有另一个优势。如果您正在使用库(原则上,在使用库时您应该使用接口),扩展为您提供了覆盖它的机会,对吗?并且接口不能有“虚拟”方法(好吧,在 C# 8 中你可以声明一个主体,它们可以)。所以,这是一个强大的选择。同样,这是一种选择,它只是武器库中的一种武器。从这个角度来看,这是一件不可思议的事情,不是吗?