2013-04-24 16 views
8

Pracuję nad programem/grą, w której mam statyczną klasę użyteczności z parametrami.Jak dziedziczyć statyczne pole i zmieniać jego wartość?

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

Następnie muszę nadpisać te wartości w niektórych szczególnych przypadkach, na przykład na mapie z ograniczonym wynikiem. Więc zrobiłem następujący:

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

i zamierzone użycie jest następujący:

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

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

nie zostały faktycznie przetestowane tego kodu, ponieważ IDE narzeka nazywając pola statycznego poprzez przykład i również o ukrywanie pola . Wyraźnie widzę, że ten kod jest cuchnący, więc czy istnieje sposób, aby to osiągnąć, czy też muszę osobno napisać każdą klasę paramu?

PS: Wiem, że chcę uczynić domyślną klasę abstrakcyjną i używać getterów, jestem ciekawy, czy istnieje sposób na statyczne udostępnienie wartości.

+1

Powiedziałbym, że prawdopodobnie nie chcesz statycznych pól/metod tutaj, to jest tak proste, jak to naprawdę. Dlaczego po prostu nie utworzyć jego instancji i uzyskać pełne dziedzictwo? – ddmps

+0

Cóż, to chyba zły nawyk z C, w którym używałem prostego #define do ustawiania parametrów globalnych. Wydawało mi się to trochę przesadzone, tworząc instancję tylko z numerycznymi parametrami. – jnovacho

Odpowiedz

6

Nie można przesłonić elementów statycznych - w Javie żadne metody ani pola nie mogą zostać przesłonięte. Jednak w tym przypadku wygląda na to, że nie musisz tego robić: ponieważ masz instancję ParamsGeneral w zmiennej par, metoda niestatyczna zrobiłaby to, czego potrzebujesz w przypadku zwykłego nadpisania.

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

Mieć MAX_SCORE mieć prywatne statyczne z publicznych pobiera statycznych; następnie możesz zadzwonić pod numer ParamsGeneral.getMaxScore i ParamsLimited.getMaxScore, a otrzymasz odpowiednio 1000 i 500

2

Nie użyłbym podklasy do ogólnej gry w ograniczonej grze. Chciałbym używać wyliczenie, jak:

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

Następnie przy konstruowaniu gry, można zrobić:

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

i tak dalej.

Robiąc to w ten sposób, można zmienić charakter swojej gry, zachowując jednocześnie scentralizowane wartości. Wyobraź sobie, że dla każdego typu parametru, o którym myślisz, musisz stworzyć nową klasę. Może to być bardzo skomplikowane, możesz mieć setki zajęć!

+0

Chcę uniknąć tego podejścia, ponieważ nie rozwiąże to problemu. Chodzi o to, że istnieje wiele paramów, ale tylko nieliczni będą wyspecjalizowani. Powiedzmy, że 2 z 30. I wszystkie parametry muszą być dostępne w ten sam sposób - stąd superparametr ParamsGeneral. – jnovacho

+1

@jnovacho Bardzo trudno jest udzielić ci najlepszej porady, nie wiedząc więcej o swojej architekturze. Po prostu nie koduj podklasami podklas, ponieważ stanie się on bardzo nieopłacalny, im więcej parametrów zajmujesz w szczególnym przypadku.Jeśli jeden parametr ma 5 wartości, a drugi ma 3 wartości, jest to 15 klas. Jeśli inny ma 4 wartości, to jest 60 klas ... – durron597

1

rozwiązanie Najprostszy jest, aby to zrobić:

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

Nie trzeba mieć wystąpienie ParamsGeneral, to jest po prostu zbiorem statycznych definicji gry.

Powiązane problemy