分類:[C#]
C#のオーバーライドについて質問です。
AAAを継承するBBB、CCC、DDDがあり、派生クラスでMsg()メソッドが定義されていない場合は基底クラスAAAのMsg()メソッドを呼び出すようにしたいと思っています。
ところがAAA型の変数でMsg()を実行するとAAA.Msg()が実行されてしまうため、目的のBBB.Msg()、CCC.Msg()が実行されません。
たとえばlistに内包された全ての変数に対してMsg()を実行したい時には、想定される派生型すべてをチェックしてキャストした後Msg()を呼び出すことでとりあえず解決していますが、これからどんどん派生クラスが増えて行くことを考えるとキャスト忘れが起きそうなのでスマートではないように思いました。
もし良い書き方があれば御教示頂けないでしょうか。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace オーバーライドメソッド呼び出し
{
class Program
{
private static List<AAA> list = new List<AAA>();
static void Main(string[] args)
{
list.Add(new AAA());
list.Add(new BBB());
list.Add(new CCC());
list.Add(new DDD());
Console.WriteLine("全てAAA.Msgが実行されてしまう。");
foreach (var item in list)
{
item.Msg();
}
Console.WriteLine("-----");
Console.WriteLine("それぞれキャストすれば意図した通りに実行されるが…");
foreach (var item in list)
{
if (item is BBB)
((BBB)item).Msg();
else if (item is CCC)
((CCC)item).Msg();
else
item.Msg();
}
Console.ReadLine();
}
}
public class AAA
{
public void Msg()
{
Console.WriteLine("AAA");
}
}
public class BBB : AAA
{
public new void Msg()
{
Console.WriteLine("BBB");
}
}
public class CCC : AAA
{
public new void Msg()
{
Console.WriteLine("CCC");
}
}
public class DDD : AAA
{
//DDD専用のMsgメソッドは無いのでAAA.Msg()を流用する。
}
}
|