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: デフォルトのクラスを抽象化し、ゲッターを使用する必要があることはわかっています。値に静的にアクセスできるようにする方法があるかどうかに興味があります。

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

public MAX_SCOREstatic ゲッターを使用して private static にする必要があります。次に、呼び出すことができ、それぞれ1000ParamsGeneral.getMaxScoreParamsLimited.getMaxScore500を取得します

于 2013-04-24T21:57:56.330 に答える