我有一个抽象类可移动 ,方法abstract void move()
由类 Bullet 扩展和抽象类字符 , 字符 由类幸存者扩展 和类 Zombie 。在 幸存者 和 子弹 中,move()
方法在类Zombie中不需要任何参数{ {1}}方法取决于幸存者的实际位置。幸存者和多个僵尸是在类 Gui 中创建的。
我想在 Zombie 中访问幸存者 - 这样做的最佳方法是什么?在 Gui 我写了一个方法move()
,但我没有看到如何在 Zombie 中访问此方法
我知道作为一种解决方法,我可以在getSurvivor()
中将[ 幸存者 幸存者]作为参数传递,并在 子弹 和 幸存者 ,但感觉如此......糟糕的做法。
答案 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, ...);
}
...
}