使用List <parent>对象</parent>中的Child方法

时间:2012-10-28 01:11:20

标签: c# c#-4.0

目前我有很多类似的方法:从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列表中的所有元素?

2 个答案:

答案 0 :(得分: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(); 
}

由于多态性,这里将调用重写(子)方法。

答案 1 :(得分:0)

Lazrberezosky的答案对于一般情况是正确的,所以我标记他的正确。

但是对于我的个人问题,我使用的许多家长课程中的一个被标记为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 1}}并抛出编译器错误。

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