0

考虑以下代码:

// ======== 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 在此处建议的代码:“基类方法调用派生类方法?” ]

在给定的代码示例中,我想让运行时执行每个派生类对象的某个方法,在这种情况下,它是“loseEnergy()”,但是,我找不到解决方案。

我该如何解决这个问题?为了解决这个问题,知道或尝试什么有用?

非常感激你的帮助!谢谢!

亲切的问候,塞加拉

PS到目前为止我所做的一些搜索:

编辑:

我决定坚持我之前的想法,即拥有一些列表,其中包含具有“loseEnergy()”方法的类的对象。有了这样的列表,我将能够调用每个对象的方法“loseEnergy()”,这正是我想要的。

问题可以关闭。

谢谢你。

4

3 回答 3

0

在您在上面的帖子中提到的 Greenfoot 环境中,该act()方法仅在已添加到“世界”中的参与者上调用。在内部,这会将它们添加到列表中。模拟过程遍历列表并act()依次调用每个对象。系统不知道不在“世界中”的对象,因此不会调用它们的 act 方法。这里没有魔法。

如果您想要类似的行为但不手动将对象添加到列表中,您可以让基类构造函数将新对象添加到全局列表中。我不知道 C#,所以我不确切知道如何做到这一点,但我无法想象这会很困难。

于 2013-08-06T13:26:29.607 回答
0

我真的不明白你的问题,但无论如何我可以尝试给你一些使用抽象类的方法:

  • 如果你使用抽象方法,你应该在子类中重写它(就像在接口中声明的方法)

  • 如果你想让所有继承的类使用相同的方法,你可以在抽象类中实现它;如果您不覆盖它,所有子类都将使用您实现的方法,您必须不在子类中声明它(扩展 < ABS_CLASS > 就足够了)

  • 如果你想使用在子类中被覆盖的抽象类的方法,你可以使用关键字super

我希望它会帮助你。

于 2013-03-26T08:16:51.043 回答
0

如果你的意思是你想要调用:female.loseEnergy() -> human.loseEnergy() -> creative.loseEnergy(),在覆盖的第一行调用基本方法

public class Female : Human 
{
    public override void loseEnergy()
    {
        base.loseEnergy();
        // do stuff
    }
}
于 2013-03-26T08:32:17.553 回答