0

目前我有很多相似的方法:从一个Parents 列表中,我将一个对象转换为它的正确类型,然后Drawing 它。这很好用,但是非常笨拙,因为除了演员表之外,每种方法都完全相同。

它看起来像这样

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 的回答对于一般情况是正确的,所以我将他标记为正确。

但是对于我个人的问题,我正在使用的许多 Parent 类之一被标记为,virtual而不是override因此它错误地从Parent类上方查看到它的父类,这很可能是Object给我一个错误。

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

当我Parent.Draw在列表中调用时,它Parent.Draw看到它Child.Drawvirtual这样的,我想,它又回到Object.Draw并抛出了一个编译器错误。

为清楚起见,请随意编辑。

于 2012-10-28T03:17:15.460 回答