web-dev-qa-db-ja.com

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

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

たとえば、次のことを達成するためです。

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

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

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

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

112
Greg

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

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

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

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

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

173
Aaronaught