请考虑以下代码:
// ======== Abstract class ========
public abstract class Creatures {
public abstract void loseEnergy();
public void execute()
{
loseEnergy();
}
}
// ======== Animals ========
public class Animals : Creatures
{
public override void loseEnergy(){}
}
public class Birds : Animals
{
public override void loseEnergy(){}
}
// ======== Human ========
public class Human : Creatures
{
public override void loseEnergy(){}
}
public class Male : Human
{
public override void loseEnergy(){}
}
public class Female : Human
{
public override void loseEnergy(){}
}
[此代码基于Jayson在此处建议的代码:"Base class methods calling derived class methods ?"]
在给定的代码示例中,我希望运行时执行EACH派生类对象的某种方法,在这种情况下,这是'loseEnergy()',但是,我找不到解决方案。
如何解决此问题? 知道或尝试什么可能有用...以解决这个问题?
非常感谢您的帮助! 谢谢!
亲切的问候, Segara
P.S。到目前为止我做了一些搜索:
修改
我决定坚持我之前的想法,即拥有一些列表,其中包含具有'loseEnergy()'方法的类的对象。有这样的列表,我将能够调用每个对象的方法'loseEnergy()',这就是我想要的。
问题可以结束。
谢谢。
答案 0 :(得分:0)
我真的不明白你的问题,但无论如何我可以尝试给你一些方法来使用抽象类:
如果你使用抽象方法,你应该在子类中重写它(比如在接口中声明的方法)
如果您希望所有继承的类使用相同的方法,则可以在抽象类中实现它;如果不覆盖它,所有子类都将使用您实现的方法,您必须不在子类中声明它(extends< ABS_CLASS>足够好)
如果你想使用在子类中覆盖的抽象类的方法,你可以使用关键字 super 。
我希望它会对你有所帮助。
答案 1 :(得分:0)
如果您的意思是想要通话:female.loseEnergy() - > human.loseEnergy() - > creature.loseEnergy(),在覆盖的第一行中调用基本方法
public class Female : Human
{
public override void loseEnergy()
{
base.loseEnergy();
// do stuff
}
}
答案 2 :(得分:0)
在上面的帖子中提到的Greenfoot环境中,仅在已添加到“world”中的actor上调用act()
方法。在内部,这会将它们添加到列表中。模拟过程遍历列表并依次调用每个对象上的act()
。系统不知道不在“世界上”的对象,因此不要调用它们的act方法。这里没有魔法。
如果您想要类似的行为,但没有手动将对象添加到列表中,您可能会让基类构造函数将新对象添加到全局列表中。我不知道C#所以我不确切知道如何做到这一点,但我无法想象它会很难。