9

我正在开发带有参数的静态实用程序类的程序/游戏。

class ParamsGeneral {
   public static final int H_FACTOR = 100;
   public static int MAX_SCORE = 1000;
   ...
}

那么我需要在某些特定情况下覆盖此值,例如在分数有限的地图上玩。所以我做了以下事情:

class ParamsLimited extends ParamsGeneral {
   public static int MAX_SCORE = 500;
   // other params stay same
}

预期用途如下:

class Player {
   ParamsGeneral par;
   public Player() {
      if(onLimitedMap()){
          par = new ParamLimited();
      }
   }

   public boolean isWinner() {
      if(this.score == par.MAX_SCORE) {
          return true;
      }
      return false;
   }
}

我还没有实际测试过这段代码,因为 IDE 抱怨通过实例调用静态字段以及字段隐藏。我清楚地看到这段代码很臭,那么有没有办法实现这一点,还是我必须分别编写每个参数类?

PS:我知道我应该使默认类抽象并使用getter,我只是好奇是否有办法使这些值可以静态访问。

4

4 回答 4

6

您不能覆盖静态成员 - 在 Java 中,方法和字段都不能被覆盖。但是,在这种情况下,您似乎不需要执行任何操作:因为您ParamsGeneralpar变量中有一个 的实例,所以非静态方法可以通过常规覆盖完成您需要的操作。

class ParamsGeneral {
    public int getMaxScore() {
        return 1000;
    }
}
class ParamsLimited extends ParamsGeneral {
    @Override public int getMaxScore() {
        return 500;
    }
}

...

public boolean isWinner() {
    // You do not need an "if" statement, because
    // the == operator already gives you a boolean:
    return this.score == par.getMaxScore();
}
于 2013-04-24T21:57:40.533 回答
2

我不会将子类化用于一般游戏与有限游戏。我会使用枚举,例如:

public enum Scores {
    GENERAL (1000),
    LIMITED (500),
    UNLIMITED (Integer.MAX_INT);

    private int score;
    private Scores(int score) { this.score = score; }
    public int getScore() { return score; }
}

然后,在构建游戏时,您可以执行以下操作:

Params generalParams = new Params(Scores.GENERAL);
Params limitedParams = new Params(Scores.LIMITED);

等等。

这样做可以让您改变游戏的性质,同时保持您的价值观集中。想象一下,如果对于您想到的每种类型的参数,您都必须创建一个新类。它可能会变得非常复杂,你可能有数百个类!

于 2013-04-24T21:58:36.850 回答
1

最简单的解决方案是这样做:

class ParamsGeneral {
   public static final int H_FACTOR = 100;
   public static final int MAX_SCORE = 1000;
   public static final int MAX_SCORE_LIMITED = 500;
   ...
}

class Player {

   int maxScore;

   public Player() {
      if(onLimitedMap()){
          maxScore = ParamsGeneral.MAX_SCORE_LIMITED;
      }
      else {
          maxScore = ParamsGeneral.MAX_SCORE;
      }
   }

   public boolean isWinner() {
      if(this.score == this.maxScore) {
          return true;
      }
      return false;
   }
}

不需要有 ParamsGeneral 的实例,它只是您游戏的静态定义的集合。

于 2013-04-24T22:04:06.550 回答
0

具有MAX_SCORE公共静态获取器的私有静态;然后你可以打电话ParamsGeneral.getMaxScoreParamsLimited.getMaxScore你会分别得到 1000 和 500

于 2013-04-24T21:57:56.330 回答