目前我有很多类似的方法:从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
列表中的所有元素?
答案 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.Draw
是virtual
所以我想,它又回到了Object.Draw
1}}并抛出编译器错误。
为清晰起见,请随意编辑。