C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■84104 / 親階層)  オーバーライドの使い方
□投稿者/ なと (3回)-(2017/05/16(Tue) 10:31:41)

分類:[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()を流用する。
    }
}


編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
親記事 →Re[1]: オーバーライドの使い方 /初級者
→Re[1]: オーバーライドの使い方 /774RR
→Re[1]: オーバーライドの使い方 /furu
→Re[1]: オーバーライドの使い方 /Hongliang
 
上記関連ツリー

オーバーライドの使い方 / なと (17/05/16(Tue) 10:31) #84104 ←Now
Re[1]: オーバーライドの使い方 / 初級者 (17/05/16(Tue) 10:59) #84108
Re[1]: オーバーライドの使い方 / 774RR (17/05/16(Tue) 10:57) #84107
Re[1]: オーバーライドの使い方 / furu (17/05/16(Tue) 10:55) #84106
Re[1]: オーバーライドの使い方 / Hongliang (17/05/16(Tue) 10:54) #84105
  └ Re[2]: オーバーライドの使い方 / なと (17/05/16(Tue) 11:05) #84109 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信