派生クラスで基本クラスと同じシグネチャのメソッドを実装することが出来ますが、このときnewを使うかoverrideを使うかで動きが変わってきます。
結論を先に書いておくと・・・
newはフィールドの型に応じて呼び出しメソッドが決められる。
overrideはインスタンスの型に応じて呼び出しメソッドが決められる。
では、細かく見ていきましょう。
基本クラス(Base)とその派生クラス(Hoge)を作って、それぞれの動きを確認してみます。
まず、こんな感じで実装。
6 | Console.WriteLine( "Base::CallNew" ); |
9 | public virtual void CallOverride() |
11 | Console.WriteLine( "Base::CallOverride" ); |
18 | public new void CallNew() |
20 | Console.WriteLine( "Hoge::CallNew" ); |
23 | public override void CallOverride() |
25 | Console.WriteLine( "Hoge::CallOverride" ); |
どのメソッドが呼び出されているか分かるようにWriteLineメソッドを使っています。
次のプログラムで動きを見てみましょう。
3 | Hoge hoge1 = new Hoge(); |
7 | Base hoge2 = new Hoge(); |
実行した際の出力がこちら。
Hoge::CallNew
Hoge::CallOverride
Base::CallNew
Hoge::CallOverride
まずhoge1の方ですが、こちらはHogeクラスのメソッドがそのまま呼び出されています。
特に注目すべき点はありませんね。
もう一方のhoge2ですが、こちらはHogeのインスタンスをBasaクラス型にアップキャストしています。
newを使った場合はフィールドの型に応じて呼び出されるメソッドが決まることになっており、基本クラスのCallNewメソッドが呼び出されているのが分かります。
また、overrideを使った場合はインスタンスの型によって呼び出されるメソッドが決まるため、Hogeクラスのメソッドが呼び出されています。
関連があると思われる記事:
[`google_buzz` not found]
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]
[`grow` not found]