java - una - respaldo completo definicion
¿Puedo tener diferentes copias de una variable estática para cada tipo diferente de clase heredada? (4)
Quiero tener la misma variable estática con un valor diferente según el tipo de clase.
Entonces yo tendría
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 programa principal ve:
Marine.sprite = // Load sprite for all instances of Marine
Genestealer.sprite = // Load sprite for all instances of Genestealer
No quiero almacenar el mismo sprite en cada 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.
es posible?
¿Cómo lo haría?
Así que crea un Sprite y dale a todos las variables de instancia. Son solo referencias; apenas más que punteros.
No es posible 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 cambio, haga que el sprite estético en las subclases, y luego use la estructura del método descrita por Laurence.
Una prueba rápida le mostrará que, sí, puede anular variables estáticas en subclases.
He creado una estructura de herencia simple para probar esto. StaticTest es el super de StaticTestSub. Ambos declaran las TEST1
estáticas TEST1
, TEST2
y TEST3
con diversos grados de acceso. Para simplificar el ejemplo, dejé 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;
}
Puedes probar esto en casa. El out put 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
Use 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 estático si lo desea. Cosas agradables sobre este enfoque:
No se puede (fácilmente) olvidar incluir un elemento en su subclase, ya que el compilador se quejará si no 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.