2009-09-19 11 views
6

Quiero tener la misma variable estática con un valor diferente según el tipo de clase.¿Puedo tener copias diferentes de una variable estática para cada tipo diferente de clase heredada?

Así que tendría que

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 
{ 

} 

Y luego, en mi principal Go programa:

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

no quiero para almacenar el mismo en todos los sprites instancia de la clase. Quiero uno para cada tipo de clase. Quiero heredar la variable del sprite estático y la función de dibujar que dibujará el sprite. Pero no quiero que el sprite Genstealer anule al sprite marino.

¿Esto es posible?

¿Cómo lo haría?

+0

e incluso tu gravatar es un pingüino tux en armadura marina espacial - impresionante :) – weiji

+0

Supongo que también podrías definirlo en la clase padre con una "nueva excepción UnsupportedOperationException" si tuvieras ciertas clases de niños nunca esperaban tener un sprite (aunque esto también significaría que pierde los controles de tiempo de compilación). – rogerdpack

Respuesta

12

utilizar un método abstracto:

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

El sprite devuelto por getSprite puede ser una estática, si quieres. cosas buenas de este enfoque:

  • Usted no puede (fácilmente) se olvide de incluir un sprite en la subclase, ya que el compilador se quejará si no se implementa el método abstracto.

  • Es flexible. Supongamos que un marine debe verse diferente una vez que "sube de nivel". Simplemente cambie el método getSprite de Marine para tener en cuenta el nivel.

  • Es el idioma OO estándar para este tipo de cosas, por lo que las personas que miren su código no se quedarán rascándose la cabeza.

0

Así que haga un Sprite y déle a cada uno variables de instancia. Son solo referencias; apenas más que punteros.

-1

Una prueba rápida le mostrará que, sí, puede anular las variables estáticas en las subclases.

He creado una estructura de herencia simple para probar esto. StaticTest es el super de StaticTestSub. Ambos declaran entradas estáticas TEST1, TEST2 y TEST3 con diversos grados de acceso. Para simplificar el ejemplo, dejé fuera la versión 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; 
} 

Puede probarlo en casa. El hacia fuera puesto fue:

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

para sus necesidades específicas, sin embargo, recomiendo el enfoque adoptado por Laurence Gonsalves

+3

No anular, pero ocultar. –

1

No es posible para que sea estático en la superclase. Esa variable estática en la superclase es compartida (efectivamente, un singleton) por todas las subclases. Cada vez que cambie eso (por ejemplo, creando una instancia de una subclase), ese cambio se reflejará en todas las demás instancias de la subclase.

En su lugar, haga que el sprite estético en las subclases, y luego use la estructura de método descrita por Laurence.

+0

Esta es la respuesta a la pregunta original, las respuestas adicionales tienen el mismo comportamiento. Pero la respuesta es No, C# no tiene ninguna construcción para una variable estática por subclase define en la superclase. –

Cuestiones relacionadas