Home > C# > [C#] overrideとnewの違い

[C#] overrideとnewの違い

派生クラスで基本クラスと同じシグネチャのメソッドを実装することが出来ますが、このとき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クラスのメソッドが呼び出されています。
 
 

関連があると思われる記事:

このエントリーをはてなブックマークに追加
はてなブックマーク - [C#] overrideとnewの違い
Facebook にシェア
[`google_buzz` not found]
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]
[`tweetmeme` not found]
[`grow` not found]

Comments:0

Comment Form
Remember personal info

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 ミライニトドケ

Home > C# > [C#] overrideとnewの違い

Search
Feeds
Meta
人気の記事

Return to page top