在超级构造函数被调用之前无法引用游戏

时间:2015-01-06 19:00:00

标签: java inheritance constructor super

所以我有一个超类Ghost,在构造函数中有一个来自另一个类Pacman的参数。现在为了创造4种不同类型的幽灵(randy,愚蠢,特蕾西和sue,如果你是pacman),它们有很多相似之处,我正在制作Ghost的子类。在构造函数中,我从标题中得到错误。
一些Ghost.class代码:

public class Ghost extends Actor
{
    protected Pacman game;
    Randy randy;
    Ghost pinky;    //totally unsure, but not a matter of question
    public Ghost(Pacman game)
    {
        this.game = game;

这是Randy的子类:

private class Randy extends Ghost {

   Actor randy;

   public Randy(){
       super(game); //here is the error
       randy = new Actor();
       this.game = game;

这就是我这样做的原因:

public void act()
    {
        if (pinky instanceof Randy){
            moveRandom();     // Randy must move ONLY randomly unlike the other ghosts
    } 

    setSlowDown(2);

    code left out here

注意代码是碎片化的。
最后,我问这个问题,因为我找不到动态变量的解决方案。欢迎所有建议。

2 个答案:

答案 0 :(得分:1)

首先,我会摆脱兰迪的双重定义。 “Randy”用作Ghost的成员,也用作类型。如果“Randy”是一种Ghost(每个Randy都是Ghost),请使Ghost抽象并使用子类。如果“Randy”是“MovementStrategy”,则创建一个新的MovementStrategy接口和Randy实现(然后在Ghost内部设置。

一个Ghost在任何时候都不应该有两个或更多的移动策略;因为,Ghost有一个它没有使用的移动策略,这是Cruft并且完全不受欢迎。

这也可以防止需要“instanceof”来控制你的逻辑,你真的不应该出于多种原因这样做。如果MovementStrategy返回“下一个方向”,则依靠polymorphisim让“Randy”实例返回下一个方向。 “Instanceof”很好地表明您将与数据类型相关的代码放在数据类型之外,这是反面向对象的编程。

一般来说,最好使用语言的设计选择而不是语言的设计选择,所以不要立即在Java中使用非面向对象的技术,直到有非常 非常令人信服的理由。

---编辑以显示一些代码作为插图---

public Ghost extends Actor {

  private Game game;

  private MovementStrategy strategy;

  private Location location;

  public Ghost(Game game, MovementStrategy strategy) {
    this.game = game;
    this.movementStrategy = strategy;
  }

  // From Actor, I guess
  @Override
  public void act() {
    if (location == null) {
      location = game.addGhost(this);
    }
    move(movementStrategy.getDirection(game, location));
  }

  private void move(Direction direction) {
    location = game.move(this, direction);
  }

}

public interface MovementStrategy {

  public Direction getDirection(Game game, Location location);

}

public class Randy implements MovementStrategy {

  public Direction getDirection(Game game, Location location) {
    return selectRandom(game.getPermittedDirections());
  }

}

// constructing a Ghost with a Randy movement strategy

Game game = new Game();
Ghost ghost = new Ghost(game, new Randy());

答案 1 :(得分:0)

您需要将游戏作为参数传递给Randy的构造函数。