C#のoverrideとnew

virtualのメソッドを派生クラスでoverrideした場合とnewした場合での動作の違いについてです。

たとえば、下記のようなクラスがあったとします。

public class Base
{
    public virtual void Method1()
    {
        Console.WriteLine($"Base.Method1");
    }
}

このクラスのインスタンスを生成してメソッドを実行してみます。

Base baseInstance = new Base();
baseInstance.Method1();

すると下記が出力されます。これはわかります。
Base.Method1

では下記のクラスはどうでしょう。

public class A : Base
{
    public override void Method1()
    {
        Console.WriteLine($"A.Method1");
    }
}

下記のようにインスタンスをふたつの変数に入れます。
ひとつはBaseクラスの変数、もうひとつはAクラスの変数です。
それぞれでメソッドを実行するとどうなるでしょう。

Base aInstance = new A();
aInstance.Method1();
A aInstance2 = new A();
aInstance2.Method1();

下記のように出力されます。overrideしてメソッドを上書きしているので、どのように実行されても同じ結果です。
A.Method1
A.Method1

では続いて下記で試してみます。

public class B : Base
{
    public new void Method1()
    {
        Console.WriteLine($"B.Method1");
    }
}

同じようにふたつの変数に入れて実行してみます。

Base bInstance = new B();
bInstance.Method1();
B bInstance2 = new B();
bInstance2.Method1();

すると出力結果は下記となります。
Base.Method1
B.Method1

どうでしょう。Baseクラスの変数から実行する場合はBaseクラスの処理が実行されています。
overrideでは上書きしているのに対し、newでは上書きはせず、同名で別にメソッドを定義しているのです。
なのでBクラスのほうではBのメソッドが実行され、BaseクラスのほうではもとのBaseのメソッドが実行されます。

スポンサーリンク