クラスで定義済みのメソッドを拡張メソッドとしてオーバーライドできるのか?

C#

クラス(またはインターフェイス)に定義済みのメソッドと同名の拡張メソッドを作ったときの挙動がどうなるのか?という話です。

オーバーライドされるのか?それとも拡張メソッドは無視されるのか?ということです。

結論

いきなり結論ですが、「拡張メソッドは無視される」が正解でした。
MSDNにも書かれています。

拡張メソッドを使用してクラスまたはインターフェイスを拡張することはできますが、これらをオーバーライドすることはできません。 インターフェイス メソッドまたはクラス メソッドと同じ名前およびシグネチャを持つ拡張メソッドは決して呼び出されません。 コンパイル時に、型自体で定義されているインスタンス メソッドよりも低い優先順位が拡張メソッドには必ず設定されます。

引用元:拡張メソッド (C# プログラミング ガイド)

補足1 コード例

今回調べたことは、後から見直したときに文字だけでは意味がわからないので、一応コードで書いておきます。

クラス Hoge があり、メソッド string GetGreeting() を保持しているとします。

class Hoge
{
    public string GetGreeting()
    {
        return "Hello, I am Hoge !!";
    }
}

これに対して、別途拡張メソッドを用意します。

static class HogeExtensions
{
    public static string GetGreeting(this Hoge hoge)
    {
        return "Hi, I am extended Hoge's method.";
    }
}

ここで、もし GetGreeting() を呼び出しても、拡張メソッド側は実行されず、クラス本体側のメソッドが実行されるということです。

補足2 インターフェイスでは?

インターフェイスでも同様です。
同名メソッドが拡張メソッドとして定義されていても、インターフェイスの実装側メソッドがコールされます。

コメント

タイトルとURLをコピーしました