0

ちょっとした質問があります。

アプリケーションのプログラミングを開始したとき、同じレベルの型をクラスにグループ化しましたFirstLevel(そのレベルのすべての型は から派生していますFirstLevel)。その後、このタイプの一般的なリストの作成を開始しましたが、コードはエラーなしで動作しています。

さて、しばらくして、FirstLevel から派生した、または親が FirstLevel からGenerate派生した各クラスで関数を使用する必要があります。FirstLevel私はインターフェースが良い解決策になると思ったので、lクラスIGenerableと共通点を持つ各クラスへのインターフェースの実装を開始しましたFirstLeve(派生、または親が派生、または親の親....)私はそれを実装しましたFirstLevel クラスにも。

そして、これが私の問題の始まりです。にある各アイテムで生成関数を呼び出す必要がありますList<FirstLevel>IGenerableしかし、それがinの実装と呼ばれるのFirstLevelか、IGenerablein 派生クラスの実装と呼ばれるのかはわかりません。コンピューターが派生クラスで実装の呼び出しを実行することを願っています。どうか教えてください。

しかし、実装が呼び出される場合はFirstLevel、私を助けて、いくつかの解決策を提案してください。ありがとう。

4

1 に答える 1

2

Interface を使用する代わりに、仮想関数 Generate を基本クラス (FirstLevel) に追加し、必要に応じて子孫のメソッドをオーバーライドすることをお勧めします。オブジェクトにオーバーライドされたメソッドがある場合は List をループして Generate を呼び出すと、そのメソッドが実行されます。それ以外の場合は、ベース オブジェクトからメソッドが実行されます。

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var objs = new List<FirstLevel> { new FirstLevel(), new SecondLevel(), new ThirdLevel(), new SecondLevel2() };
            objs.ForEach(o => o.Generate());
            Console.ReadLine();
        }

    }

    public class FirstLevel
    {
        public virtual void Generate()
        {
            Console.WriteLine("First Level Generate called.");
        }
    }

    public class SecondLevel : FirstLevel
    {
        public override void Generate()
        {
            Console.WriteLine("Second Level generate called.");
        }
    }

    public class SecondLevel2 : FirstLevel
    {

    }
    public class ThirdLevel : SecondLevel
    {
        public override void Generate()
        {
            Console.WriteLine("Third Level genrate.");
        }
    }
}
于 2012-06-29T18:28:24.363 に答える