Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9297

[C#] overrideとnewの違い

$
0
0

(5/15追記:@shiracamusさんより指摘コメントあり、内容に間違いがあったため図解を差し替えています。)

overrideとnewの違いで少し混乱したためまとめ。
解説サイトはいくつもあるけれども、図解しているものがなかったため、図で考えてみた。
下記のような、BクラスがAクラスを継承している場合を考えてみる。

classA{publicvoidTest_New()=>Console.WriteLine("A::Test_New");publicvirtualvoidTest_Override()=>Console.WriteLine("A::Test_Override");}classB:A{publicnewvoidTest_New()=>Console.WriteLine("B::Test_New");publicoverridevoidTest_Override()=>Console.WriteLine("B::Test_Override");}

実行を以下の様に行なうと、

Aa=newB();a.Test_New();a.Test_Override();Bb=newB();b.Test_New();b.Test_Override();

結果は以下になる。
image.png

つまり、図解(下記、@shiracamusさんのソースコードに基づいている)すると
image.png

となる。
overrideの場合、派生元のメソッドを文字通り上書きしに行くので、イメージとしてはAとBが重なり合う感じ。
newの場合も、文字通り追加するので、イメージとしてはインスタンス内に二つのメソッドが存在する。
この場合、呼ばれるのは型による。
(A.Test_New()やB.Test_New()とすると、型によって呼ばれる先が異なるのはイメージできると思う)

また、@shiracamusさんのソースコードについて考えてみると

classA{publicintvalue=123;publicvoidTest_New(){Console.WriteLine($"A::New : {value}");}publicvirtualvoidTest_Override(){Console.WriteLine($"A::Override : {value}");}}classB:A{publicnewintvalue=456;publicnewvoidTest_New(){Console.WriteLine($"B::New : {value}");}publicoverridevoidTest_Override(){Console.WriteLine($"B::Override : {value}");}}

について、図解の灰色の部分は呼ばれることはないので、

Console.WriteLine("A a = new B()");Aa=newB();a.Test_New();a.Test_Override();((B)a).Test_New();// b.Test_New()と同等Console.WriteLine();Console.WriteLine("B b = new B()");Bb=newB();b.Test_New();b.Test_Override();((A)b).Test_New();// a.Test_New()と同等

の結果は、@shiracamusさんの示された下記の通りになる。

A a = new B()
A::New : 123
B::Override : 456
B::New : 456

B b = new B()
B::New : 456
B::Override : 456
A::New : 123

表にすると、
image.png
となる。


Viewing all articles
Browse latest Browse all 9297

Trending Articles