2013-04-24 31 views
8

Sto lavorando al programma/gioco in cui ho una classe di utilità statica con parametri.Come ereditare il campo statico e modificarne il valore?

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

quindi ho bisogno di sovrascrivere questi valori in alcuni casi specifici, ad esempio giocando sulla mappa con punteggio limitato. Così ho fatto seguente:

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

E l'utilizzo previsto è il seguente:

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

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

Non ho effettivamente testato questo codice, perché IDE si lamenta chiamando campo statico attraverso istanza e anche di campo nascondiglio . Vedo chiaramente che questo codice è puzzolente, quindi c'è un modo per ottenerlo o devo scrivere separatamente ogni classe param?

PS: so che shoud rendere la classe di default getter astratte e uso, io sono solo curioso di sapere se c'è un modo per rendere i valori accessibile in modo statico.

+1

Direi che probabilmente non vuoi campi/metodi statici qui, è davvero così semplice. Perché non creare solo un'istanza di esso e ottenere l'ereditarietà completa? – ddmps

+0

Beh, probabilmente è una cattiva abitudine da C, dove ero abituato a usare #define semplice per impostare i parametri globali. Questo mi sembrava un po 'eccessivo, creando istanza solo con parametri numerici. – jnovacho

risposta

6

Non è possibile eseguire l'override dei membri statici: in Java non è possibile sostituire metodi o campi. Tuttavia, in questo caso non sembra che tu debba fare nulla di tutto ciò: dal momento che hai un'istanza di ParamsGeneral nella variabile par, un metodo non statico farebbe ciò che ti serve con l'override normale.

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

Avere MAX_SCORE essere statico privato con getter statici pubblici; quindi puoi chiamare ParamsGeneral.getMaxScore e ParamsLimited.getMaxScore e riceverai rispettivamente 1000 e 500

2

Non userei la sottoclasse per un gioco generale rispetto a un gioco limitato. Vorrei utilizzare un'enumerazione, come:

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

Poi, quando si costruisce un gioco, si può fare:

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

e così via.

In questo modo è possibile modificare la natura del gioco mantenendo i valori centralizzati. Immagina se per ogni tipo di parametro pensi di dover creare una nuova classe. Potrebbe diventare molto complicato, potresti avere centinaia di classi!

+0

Voglio evitare questo approccio, perché non risolverebbe il problema. Il fatto è che ci sono molti parametri, ma solo pochi di essi saranno specializzati. Diciamo 2 su 30. E tutti i parametri devono essere accessibili allo stesso modo - da qui la super classe ParamsGeneral. – jnovacho

+1

@jnovacho È molto difficile darti il ​​consiglio migliore senza saperne di più sulla tua architettura. Basta non inserire le sottoclassi nelle sottoclassi, perché diventerà molto impossibile da mantenere, più i parametri saranno particolari.Se un parametro ha 5 valori e un altro ha 3 valori, si tratta di 15 classi. Se un altro ha 4 valori, sono 60 le classi ... – durron597

1

soluzione più semplice è quella di fare questo:

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

Non c'è bisogno di avere un caso di ParamsGeneral, è solo un insieme di definizioni statiche per il vostro gioco.

Problemi correlati