virtualのメソッドを派生クラスでoverrideした場合とnewした場合での動作の違いについてです。
たとえば、下記のようなクラスがあったとします。
1 2 3 4 5 6 7 | public class Base { public virtual void Method1() { Console.WriteLine($ "Base.Method1" ); } } |
このクラスのインスタンスを生成してメソッドを実行してみます。
1 2 | Base baseInstance = new Base(); baseInstance.Method1(); |
すると下記が出力されます。これはわかります。
Base.Method1
では下記のクラスはどうでしょう。
1 2 3 4 5 6 7 | public class A : Base { public override void Method1() { Console.WriteLine($ "A.Method1" ); } } |
下記のようにインスタンスをふたつの変数に入れます。
ひとつはBaseクラスの変数、もうひとつはAクラスの変数です。
それぞれでメソッドを実行するとどうなるでしょう。
1 2 3 4 | Base aInstance = new A(); aInstance.Method1(); A aInstance2 = new A(); aInstance2.Method1(); |
下記のように出力されます。overrideしてメソッドを上書きしているので、どのように実行されても同じ結果です。
A.Method1
A.Method1
では続いて下記で試してみます。
1 2 3 4 5 6 7 | public class B : Base { public new void Method1() { Console.WriteLine($ "B.Method1" ); } } |
同じようにふたつの変数に入れて実行してみます。
1 2 3 4 | Base bInstance = new B(); bInstance.Method1(); B bInstance2 = new B(); bInstance2.Method1(); |
すると出力結果は下記となります。
Base.Method1
B.Method1
どうでしょう。Baseクラスの変数から実行する場合はBaseクラスの処理が実行されています。
overrideでは上書きしているのに対し、newでは上書きはせず、同名で別にメソッドを定義しているのです。
なのでBクラスのほうではBのメソッドが実行され、BaseクラスのほうではもとのBaseのメソッドが実行されます。