Kann ich verschiedene Kopien einer statischen Variablen für jede andere Art von erbenden Klasse

StackOverflow https://stackoverflow.com/questions/1448092

Frage

Ich mag die gleiche statische Variable, um mit einem anderen Wert von der Art der Klasse abhängig.

Also ich würde

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
{

}

Und dann in meinem Hauptprogramm gehen:

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

Ich will nicht das gleiche Sprit in jeder Instanz der Klasse speichern. Ich möchte einen für jede Art von Klasse. Ich mag den statischen Sprite Variable und die Zeichenfunktion erben, die das Sprit ziehen werden. Aber ich will nicht der Genstealer Sprit auf die Marine-Sprite außer Kraft zu setzen.

Ist das möglich?

Wie würde ich es tun?

War es hilfreich?

Lösung

Verwenden Sie eine abstrakte Methode:

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

Das Sprite von getSprite zurückgegeben wird, kann ein statisch sein, wenn Sie mögen. Nette Dinge über diesen Ansatz:

  • Sie können nicht (leicht) vergessen ein Sprite in der Unterklasse gehören, da der Compiler beschweren, wenn Sie die abstrakte Methode nicht implementieren.

  • Es ist flexibel. Angenommen, sollte ein Marine anders aussehen, wenn er „Ebene nach oben“. Ändern Sie einfach Marine getSprite Methode, um die Ebene zu berücksichtigen.

  • Es ist das Standard-OO-Idiom für diese Art der Sache, damit die Menschen an ihrem Code suchen, werden nicht den Kopf nach links kratzen.

Andere Tipps

Es ist nicht möglich, es in der Superklasse statisch zu sein. Das statische Variable in der Superklasse geteilt wird (effektiv ein Singleton) von allen Unterklassen. Immer, wenn Sie das ändern (etwa durch eine Unterklasse instanziieren), dass Veränderungen in allen anderen Unterklasse Instanzen reflektiert werden.

Stattdessen machen das Sprite in den Unterklassen statisch, und dann die Methode Struktur von Laurence beschrieben verwenden.

Ich hatte die gleiche Frage und kam zu der Lösung, die eine statische Zuordnung zu verwenden,

Klasse. -> Object

Das folgende Codebeispiel verwendet Integer wie die Art der gewünschten „klassen static“ Variable.

import java.util.Map;
import java.util.HashMap;

class C
{
    static Map<Class<?>,  Integer> class2IntegerMap = new HashMap<Class<?>, Integer>();


    public void setClassSpecificInteger(Integer _i)
    {
        class2IntegerMap.put(this.getClass(), _i);
    }

    public Integer getClassSpecificInteger()
    {
        return class2IntegerMap.get(this.getClass());    
    }           
}

class CA extends C
{
}

class CB extends C
{
}

class CAA extends CA
{
}

public class MainClass
{
    public static void main(String []args)
    {
        CA a1 = new CA();
        CA a2 = new CA();
        CB b1 = new CB();
        CB b2 = new CB();
        CAA aa1 = new CAA();

        a1.setClassSpecificInteger(Integer.valueOf(-1));
        b1.setClassSpecificInteger(Integer.valueOf(+33));

        System.out.println("The int-value for a1 is: "+a1.getClassSpecificInteger());
        System.out.println("The int-value for b1 is: "+b1.getClassSpecificInteger());

        System.out.println("The int-value for aa1 is: "+aa1.getClassSpecificInteger());

        System.out.println("The int-value for a2 is: "+a2.getClassSpecificInteger());
        System.out.println("The int-value for b2 is: "+b2.getClassSpecificInteger());

        CA a3 = new CA();
        CB b3 = new CB();

        System.out.println("The int-value for a3 is: "+a3.getClassSpecificInteger());
        System.out.println("The int-value for b3 is: "+b3.getClassSpecificInteger());

        CAA aa2 = new CAA();

        aa2.setClassSpecificInteger(Integer.valueOf(8));

        System.out.println("The int-value for aa1 now is: "+aa1.getClassSpecificInteger());
    } 
} 

Die Ausgabe lautet:

The int-value for a1 is: -1
The int-value for b1 is: 33
The int-value for aa1 is: null
The int-value for a2 is: -1
The int-value for b2 is: 33
The int-value for a3 is: -1
The int-value for b3 is: 33
The int-value for aa1 now is: 8

Ich hoffe, das jemand hilft. Bitte Art.

So einen Sprit machen und alle Instanzvariablen geben. Sie sind nur Referenzen; kaum mehr als Zeiger.

Ein kurzer Test zeigt Ihnen, dass, ja, Sie statische Variablen in Unterklassen außer Kraft setzen können.

Ich habe eine einfache Vererbungsstruktur zusammen, dies zu testen. StaticTest ist der Super von StaticTestSub. Beide erklären statische Ints TEST1, TEST2 und TEST3 mit Graden Zugang zu variieren. Um das Beispiel zu vereinfachen, verließ ich die private Version heraus.

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

Sie können versuchen, diese zu Hause. Der außer Betrieb gesetzt war:

  

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

Für Ihre spezifischen Bedürfnisse, aber ich empfehle den Ansatz von Laurence Gonsalves

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top