2013-04-24 58 views
8

我正在使用params编写静态工具类的程序/游戏。如何继承静态字段并更改其值?

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,我只是好奇,如果有一种方法,使值静态访问。

+1

我想说你可能不希望在这里使用静态字段/方法,它的确如此简单。为什么不只是创建一个实例并获得完整的继承? – ddmps 2013-04-24 22:05:35

+0

这可能是来自C的坏习惯,我习惯于使用简单的#define来设置全局参数。这在我看来有点矫枉过正,只用数字参数创建实例。 – jnovacho 2013-04-24 22:14:00

回答

6

你不能覆盖静态成员 - 在Java中,方法和字段都不能被覆盖。但是,在这种情况下,它看起来并不需要做任何事情:因为par变量中有一个ParamsGeneral实例,所以非静态方法将执行常规覆盖所需的操作。

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(); 
} 
0

已将MAX_SCORE与public static getter进行私有静态化;那么你可以拨打ParamsGeneral.getMaxScoreParamsLimited.getMaxScore,你将分别得到1000和50000

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

等等。

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

+0

我想避免这种方法,因为它不会解决问题。事情是有很多参数,但只有少数会被专门化。假设2中的30个。所有参数都需要以相同的方式访问 - 因此是超类ParamsGeneral。 – jnovacho 2013-04-24 22:07:33

+1

@jnovacho如果你不了解你的架构,就很难给你最好的建议。只是不要硬编码子类,因为它会变得非常难以维护更多的参数你特殊情况。如果一个参数有5个值,另一个有3个值,那就是15个类。如果另一个有4个值,那就是60个类...... – durron597 2013-04-24 22:12:39

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