アットウィキロゴ

newとoverrideの違い

NewのOverride違いをメモ。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            BaseCls new01 = new SubClsNew();
            BaseCls override01 = new SubClsOverride();

            SubClsNew new02 = new SubClsNew();
            SubClsOverride override02 = new SubClsOverride();

            Console.WriteLine(new01.GetMSG());
            Console.WriteLine(new02.GetMSG());
            Console.WriteLine(override01.GetMSG());
            Console.WriteLine(override02.GetMSG());
            Console.ReadLine();
        }
    }

    // 基底クラス
    class BaseCls
    {
        public virtual string GetMSG()
        {
            return "BaseCls";
        }
    }

    // new
    class SubClsNew : BaseCls
    {
        public new string GetMSG()
        {
            return "SubClsNew";
        }
    }

    // override
    class SubClsOverride : BaseCls
    {
        public override string GetMSG()
        {
            return "SubClsOverride";
        }
    }
}

出力結果
BaseCls
SubClsNew
SubClsOverride
SubClsOverride


BaseClsの型にSubClsNewやSubClsOverrideを突っ込むと、
SubClsNewの場合は、BaseCls.GetMSG()の実行結果が得られる。
SubClsOverrideの場合は、SubClsOverride.GetMSG()の実行結果が得られる。

※newを使う場合は、普通virtualは使わないけど

実際の挙動とは違うけど、イメージは下記のような感じ。

newを使った場合は、BaseCls.GetMSG()の外側にSubClsNew.GetMSGを被せている感じ。
だから、BaseClsしか入らない大きさの箱に突っ込むと、外側にあるSubClsNew.GetMSG()は入らないので、捨てられる。
newは、BaseCls.GetMSG()の前に、SubClsNew.GetMSG()を置いて、SubClsNew.GetMSG()が実行されるようにしている感じがする。

overrideを使った場合は、BaseCls.GetMSG()をSubClsOverride.GetMSGで置き換えている感じ。
だから、BaseClsしか入らない大きさの箱に突っ込んでもSubClsOverride.GetMSG()が使える。
overrideは、BaseCls.GetMSG()を取っ払って、代わりにSubClsOverride.GetMSG()を置いて、SubClsOverride.GetMSG()が実行されるようにしている感じがする。




最終更新:2011年06月14日 00:46
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。