地址呼叫类

时间:2010-05-20 10:54:03

标签: java oop

我有一个抽象类可移动 ,方法abstract void move() Bullet 扩展抽象类字符 字符 幸存者扩展 Zombie 。在 幸存者 子弹 中,move()方法在类Zombie中不需要任何参数{ {1}}方法取决于幸存者的实际位置。幸存者和多个僵尸是在 Gui 中创建的。

我想在 Zombie 中访问幸存者 - 这样做的最佳方法是什么?在 Gui 我写了一个方法move(),但我没有看到如何在 Zombie 中访问此方法

我知道作为一种解决方法,我可以在getSurvivor()中将[ 幸存者 幸存者]作为参数传递,并在 子弹 幸存者 ,但感觉如此......糟糕的做法。

5 个答案:

答案 0 :(得分:2)

在现实世界(嘿嘿),僵尸在探测幸存者时开始向幸存者移动。

因此,您可以通过向Zombie类添加方法.detect(Survivor)来开始建模。或.follow(Survivor)。在这个简化的模型中,你创建幸存者和僵尸的Gui类可以简单地通过引用幸存者来调用僵尸的检测方法。对于Moveable,您可以添加获取当前位置的方法。

外出时别忘了带上霰弹枪。

答案 1 :(得分:0)

这取决于您的幸存者被关押的地方。你的僵尸需要从某个地方引用幸存者 - 它需要什么?谁应该负责提供这个?

听起来你的Gui实际上做得太多了,我更喜欢有一个名为GameState的类来管理位置,然后让Gui处理输出。在任何情况下,如果有一个幸存者,你可以简单地在你的Gui / Gamestate上使用getSurvivor()方法 - 僵尸应该可以引用它所属的当前游戏状态。或者你可以让GameState成为一个单身人士,僵尸可以这样访问它。

编辑:回复您的评论,可能是这样的:

public class Zombie
{
   private final Gui guiThatMadeMe;

   public Zombie(Gui owner)
   {
      guiThatMadeMe = owner;
   }

   ....

   public void move()
   {
      Survivor guy = guiThatMadeMe.getSurvivor();

      // Do whatever you need to with the survivor
   }
}


public class Gui
{
   private Survivor lonelyGuy;

   ... 

   public Survivor getSurvivor()
   {
      return lonelyGuy;
   }

   public void createNewGame() // I'm guessing you have some method like this
   {
       lonelyGuy = new Survivor();
       for (int i = 0; i < NUM_ZOMBIES; i++)
       {
          Zombie zombie = new Zombie(this); // pass in this reference
          // Do something with the zombie
       }
       // other setup
   }
}

无论如何,僵尸必须获得对知道如何获得幸存者的某事的引用。另一种选择是让幸存者直接进入僵尸,但这种感觉并不那么干净。如果僵尸必须总是拥有一个且只有一个幸存者,这可能是一个可行的选择,但这感觉就像是一个人为的限制。

答案 2 :(得分:0)

如果只有一个幸存者,你应该研究Singleton设计模式。

答案 3 :(得分:0)

实际上,我会说move()不应该是没有参数的方法。 Move的语义意味着有一个目标要移动到,所以它应该是

move(Target t)

其中Target是由Zombie和Survivor实现的接口或

move(Position p)

最好,您可以找到涵盖两者的抽象(目标,例如可以是目标人或目标位置)

答案 4 :(得分:0)

将@Andrzej Doyle的GameState想法扩展到......

如果所有僵尸需要来自(可能很复杂的)Gui类是Survivor的位置,让Gui用这个方法实现一个简单的接口,并让Gui在构造它们时将自己的一个实例传递给Zombies。 / p>

这使得Zombie更容易被测试,因为只需要模拟一个方法。

interface GameState {
  Survivor getSurvivor();
}

class Zombie extends Character {
  public Zombie(GameState gs, ...) {
    this.gs = gs;
    ...
  }
  ...
}

class Gui implements GameState {
  ...
  private createZombie(...) {
    return new Zombie(this, ...);
  }
  ...
}