2009-09-19 10 views
6

Voglio avere la stessa variabile statica con un valore diverso a seconda del tipo di classe.Posso avere copie diverse di una variabile statica per ogni diverso tipo di classe ereditaria

Così avrei

public class Entity 
{ 
    public static Bitmap sprite; 

    public void draw(Canvas canvas, int x, int y) 
    { 
      canvas.drawBitmap(sprite, x, y, null); 
    } 
} 

public class Marine extends Entity 
{ 

} 

public class Genestealer extends Entity 
{ 

} 

E poi nel mio go programma principale:

Marine.sprite = // Load sprite for all instances of Marine 
Genestealer.sprite = // Load sprite for all instances of Genestealer 

Non voglio per memorizzare lo stesso sprite in ogni istanza della classe. Ne voglio uno per ogni tipo di classe. Voglio ereditare la variabile statica dello sprite e la funzione draw che disegnerà lo sprite. Ma non voglio che lo sprite di Genstealer scavalchi lo sprite di Marine.

È possibile?

Come faccio?

+0

e persino il tuo gravatar è un tux pinguino in armatura spaziale marina - fantastico :) – weiji

+0

Suppongo che potresti anche definirlo nella classe genitore con un "lancio di nuova UnsupportedOperationException" se avessi certe classi di bambini che non dovrebbero avere uno sprite (anche se questo significherebbe anche perdere i controlli del tempo di compilazione). – rogerdpack

risposta

12

Utilizzare un metodo astratto:

public class Entity 
{ 
    public abstract Bitmap getSprite(); 

    public void draw(Canvas canvas, int x, int y) 
    { 
      canvas.drawBitmap(getSprite(), x, y, null); 
    } 
} 

public class Marine extends Entity 
{ 
    public Bitmap getSprite() { 
     return /*the sprite*/; 
    } 
} 

Lo sprite restituito da getSprite può essere una statica, se volete. Cose belle di questo approccio:

  • Non si può (facilmente) dimenticare di includere uno sprite nella sottoclasse, dal momento che il compilatore si lamenterà se non si implementa il metodo astratto.

  • È flessibile. Supponiamo che un marine debba apparire diverso una volta che "sale di livello". Basta cambiare il metodo getSprite di Marine per tenere conto del livello.

  • È lo standard OO-idioma per questo genere di cose, quindi le persone che guardano il loro codice non saranno lasciate a grattarsi la testa.

0

Quindi creare uno Sprite e assegnare a tutte le variabili di istanza. Sono solo riferimenti; difficilmente più di puntatori.

-1

Un test rapido mostra che, sì, è possibile sostituire le variabili statiche in sottoclassi.

Ho messo insieme una struttura di ereditarietà semplice per testarlo. StaticTest è il super di StaticTestSub. Entrambi dichiarano valori statici TEST1, TEST2 e TEST3 con diversi gradi di accesso. Per semplificare l'esempio, ho omesso la versione private.

public class StaticTest { 
    public static int TEST1 = 1; 
    protected static int TEST2 = 1; 
    static int TEST3 = 1; 

    public static void main(String[] args) { 
      System.out.println("StaticTest.TEST1: " + StaticTest.TEST1); 
      System.out.println("StaticTest.TEST2: " + StaticTest.TEST2); 
      System.out.println("StaticTest.TEST3: " + StaticTest.TEST3); 
      System.out.println("StaticTestSub.TEST1: " + StaticTestSub.TEST1); 
      System.out.println("StaticTestSub.TEST2: " + StaticTestSub.TEST2); 
      System.out.println("StaticTestSub.TEST3: " + StaticTestSub.TEST3); 
    } 
} 


public class StaticTestSub extends StaticTest { 
    public static int TEST1 = 2; 
    protected static int TEST2 = 2; 
    static int TEST3 = 2; 
} 

Si può provare questo a casa. Il fuori messo è stato:

StaticTest.TEST1: 1
StaticTest.TEST2: 1
StaticTest.TEST3: 1
StaticTestSub.TEST1: 2
StaticTestSub.TEST2: 2
StaticTestSub.TEST3: 2

Per le vostre esigenze specifiche, però, vi consiglio l'approccio adottato da Laurence Gonsalves

+3

Non sovrascrive, ma nasconde. –

1

Non è possibile per essere statica nella classe eccellente. Quella variabile statica nella super classe è condivisa (effettivamente un singleton) da tutte le sottoclassi. Ogni volta che si cambia (ad esempio, istanziando una sottoclasse), tale modifica si riflette in tutte le altre istanze di sottoclasse.

Invece, rendere lo sprite statico nelle sottoclassi e quindi utilizzare la struttura del metodo descritta da Laurence.

+0

Questa è la risposta alla domanda originale, le risposte di orther devono ottenere lo stesso comportamento. Ma la risposta è No, C# non ha costrutto anycon per la variabile statica per sottoclasse definita nella superclasse. –

Problemi correlati