在所有派生类中调用一个特定的重写方法

时间:2013-03-26 08:06:34

标签: c#-4.0 actor derived-class greenfoot

请考虑以下代码:

// ======== 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()',这就是我想要的。

问题可以结束。

谢谢。

3 个答案:

答案 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#所以我不确切知道如何做到这一点,但我无法想象它会很难。