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のメソッドが実行されます。