- 2014-12-21 (日) 0:38
- C#
派生クラスで基本クラスと同じシグネチャのメソッドを実装することが出来ますが、このときnewを使うかoverrideを使うかで動きが変わってきます。
結論を先に書いておくと・・・
newはフィールドの型に応じて呼び出しメソッドが決められる。
overrideはインスタンスの型に応じて呼び出しメソッドが決められる。
では、細かく見ていきましょう。
基本クラス(Base)とその派生クラス(Hoge)を作って、それぞれの動きを確認してみます。
まず、こんな感じで実装。
// 基本クラス class Base { public void CallNew() { Console.WriteLine("Base::CallNew"); } public virtual void CallOverride() { Console.WriteLine("Base::CallOverride"); } } // 派生クラス class Hoge : Base { public new void CallNew() { Console.WriteLine("Hoge::CallNew"); } public override void CallOverride() { Console.WriteLine("Hoge::CallOverride"); } }
どのメソッドが呼び出されているか分かるようにWriteLineメソッドを使っています。
次のプログラムで動きを見てみましょう。
void Main() { Hoge hoge1 = new Hoge(); hoge1.CallNew(); hoge1.CallOverride(); Base hoge2 = new Hoge(); hoge2.CallNew(); hoge2.CallOverride(); }
実行した際の出力がこちら。
Hoge::CallNew Hoge::CallOverride Base::CallNew Hoge::CallOverride
まずhoge1の方ですが、こちらはHogeクラスのメソッドがそのまま呼び出されています。
特に注目すべき点はありませんね。
もう一方のhoge2ですが、こちらはHogeのインスタンスをBasaクラス型にアップキャストしています。
newを使った場合はフィールドの型に応じて呼び出されるメソッドが決まることになっており、基本クラスのCallNewメソッドが呼び出されているのが分かります。
また、overrideを使った場合はインスタンスの型によって呼び出されるメソッドが決まるため、Hogeクラスのメソッドが呼び出されています。
関連があると思われる記事:
- [Android] Handler内部クラス実装時の注意点
- [Android] プリファレンスでデータ保存
- [Android] 音声録音
- [Android] 現在日時の取得
- [Android] メニュー処理
- Newer: [C#] 文字列をbyte配列に変換
- Older: [WPF] 色定義文字列からColorオブジェクトを生成
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://gacken.com/wp/program/c-sharp/2692/trackback/
- Listed below are links to weblogs that reference
- [C#] overrideとnewの違い from ミライニトドケ