0

現在、私はすべて類似しているメソッドをたくさん持っています。sのリストからParent、オブジェクトを適切なタイプにキャストしてから、それをDraw実行します。これは問題なく機能しますが、キャスト以外の各方法はまったく同じであるため、非常に扱いにくいです。

こんな感じ

public class Parent
{ 
    public virtual void Draw()
    {
        //deliberately nothing
    }
}

public class Child1 : Parent
{ 
    public override void Draw()
    {
        //draw this object, but slightly different method than Parent
    }
}

public class Child2 : Parent
{ 
    public override void Draw()
    {
        //draw this, but slightly different method than Child1 and Parent
    }
}

/////////////////////////

List<Parent> parent_list = new List<Parent>();
parent_list.Add(new Child1());
parent_list.Add(new Child2());

/////////////////////////

foreach (Parent parent in parent_list)
{
    parent.Draw(); //Would like to use child1 and child2's draw
}

/////////////////////////

///instead I'm doing a manual cast for each child class
foreach (Parent parent in parent_list)
{
    Child1 child = (Child1)parent;
    child.Draw();
}

foreach (Parent parent in parent_list)
{
    Child2 child = (Child2)parent;
    child.Draw();
}

Parent.Draw()私が直面している問題は、電話をかけたいときに電話をかけようとしていることChild.Draw()です。コードを設計するためのより良い方法があると確信していますが、それを理解することはできません。

Draw共通しているのが親だけである場合、リスト内のすべての要素をエレガントに呼び出すにはどうすればよいですか?

4

2 に答える 2

2

子クラスはParentから継承されていると思います(そうでない場合、子オブジェクトを親コレクションに追加してDrawメソッドをオーバーライドすることはできません)。this.Drawまた、なぜ内部Drawメソッドを呼び出しているのかわかりませんか?再帰呼び出しが発生します。そこにメソッドの実装があるはずです

public class Parent 
{ 
    public virtual void Draw()
    {
       // parent implementation of Draw
    }
}

public class Child1 : Parent
{ 
    public override void Draw()
    {
        // child1 implementation of Draw
    }
}

public class Child2 : Parent
{ 
    public override void Draw()
    {
        // use base.Draw() to call parent implementation
        // child2 implementation of Draw
    }
}

その後、あなたがするとき

foreach (Parent parent in parent_list)
{
    parent.Draw(); 
}

ポリモーフィズムのため、オーバーライドされた(子)メソッドがここで呼び出されます。

于 2012-10-28T01:14:07.393 に答える
0

Lazrberezoskyの答えは一般的なケースでは正しかったので、私は彼に正解のマークを付けました。

virtualしかし、私の個人的な問題として、私が使用していた多くの親クラスの1つが代わりにマークされていたため、クラスoverrideの上から親を誤って調べていたため、エラーが発生した可能性があります。ParentObject

 Object.Draw    
 Parent.Draw - Virtual    
  Child.Draw - Override //incorrectly was virtual in my code    
G_Child.Draw - Override

Parent.Drawがリストを呼び出したとき、それはそうだったParent.Drawのを見ました、そして、私は、それが戻ってコンパイラエラーを投げたと思います。Child.DrawvirtualObject.Draw

わかりやすくするために、自由に編集してください。

于 2012-10-28T03:17:15.460 に答える