如何继承静态字段,并改变它的价值呢?(How to inherit static field and

2019-09-01 02:14发布

我工作的程序/游戏,我有使用参数的静态实用工具类。

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抱怨通过实例,也对现场的藏身调用静态字段。 我清楚地看到,这个代码是太臭了,那么有没有办法实现这个还是我必须要分开来写每个PARAM类?

PS:我知道我768,16使默认抽象类和使用干将,我只是好奇,如果有一种方法可以使静态值入店。

Answer 1:

你不能覆盖静态成员 - 在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();
}


Answer 2:

我不会用子类为一般游戏VS有限的游戏。 我会用枚举,如:

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);

等等。

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



Answer 3:

最简单的办法是做这样的:

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的实例,它仅仅是一个为你的游戏静态定义集合。



Answer 4:

MAX_SCORE与公共静态干将私人静态的; 然后你可以打电话ParamsGeneral.getMaxScoreParamsLimited.getMaxScore分别,你会得到1000和500



文章来源: How to inherit static field and change it's value?