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