拡張メソッドをインターフェイスに適用できますか?


123

拡張メソッドをインターフェースに適用することは可能ですか?(C#の質問)

たとえば、次のことを実現します。

  1. ITopologyインターフェイスを作成する

  2. このインターフェイスの拡張メソッドを作成します(例:public static int CountNodes(this ITopology topologyIf))

  3. 次に、ITopologyを実装するクラス(MyGraphなど)を作成すると、自動的にCount Nodes拡張機能が追加されます。

このようにして、インターフェースを実装するクラスは、拡張メソッドで定義されたものに合わせるためにセットのクラス名を持つ必要はありません。

回答:


188

もちろん可能です。Linqのほとんどは、インターフェース拡張メソッドを中心に構築されています。

インターフェースは、実際には拡張メソッドの開発の原動力の1つでした。拡張メソッドは、独自の機能を実装できないため、実際のコードをインターフェイス定義に関連付ける最も簡単な方法です。

構築された拡張メソッドのコレクション全体については、Enumerableクラスを参照しくださいIEnumerable<T>。これを実装することは、クラスに実装することと同じです。

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

インターフェースに関する限り、拡張メソッドには特に違いはありません。拡張メソッドは、静的メソッドであり、コンパイラーが構文シュガーを適用して、メソッドがターゲット型の一部のように見えるようにします。


33
再:「もちろん」-質問は、あなたが暗黙的に述べた建築のにおいを明らかにしていると思います。インターフェースに拡張機能を持たせることができる場合、インターフェースに実装されたメソッドを含めることができないのはなぜですか?どちらかのインターフェースが具体的なメソッドを持つことができるはずだと考えることは理解できます。あるいは、それらができないことがわかったら、拡張メソッドは実行可能なクラッジとして許可されるべきではないと思います。(しかし、そうです。あなたの優れた答えについて議論するのではなく、「もちろん」と、LINQではなくIEnumへのリンクだけです。; ^ D)何かが臭いです!
ruffin

@ruffinコメントにニュースを追加します。これで、C#インターフェイスメソッドにデフォルトの実装を追加できるようになりました。出典:devblogs.microsoft.com/dotnet/...
Vinigas

@ruffin私はこれがC#で最もわかりにくいアーキテクチャ上の決定であると感じました。たまに、ハーフクラスハーフインターフェース構造が混乱してしまうことがあります。それでも、関数型プログラミングの観点からアプローチし、機能を実装するのではなく、インターフェイスにユーティリティを導入するために使用すると便利だと思います。
Guney Ozsan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.