Question

Je veux avoir la même variable statique avec une valeur différente en fonction du type de classe.

J'aurais

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
{

}

Et puis dans mon Princ programme:

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

Je ne veux pas stocker le même sprite dans tous les cas de la classe. Je veux un pour chaque type de classe. Je veux hériter de la variable sprite statique et la fonction de tirage au sort qui attirera l'image-objet. Mais je ne veux pas l'image-objet Genstealer de passer outre le sprite Marine.

Est-ce possible?

Comment puis-je faire?

Était-ce utile?

La solution

Utilisez une méthode abstraite:

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

Le lutin retourné par getSprite peut être statique si vous le souhaitez. Les plus belles choses au sujet de cette approche:

  • Vous ne pouvez pas (facilement) oublier d'inclure un sprite dans votre sous-classe, car le compilateur se plaindra si vous ne mettez pas en œuvre la méthode abstraite.

  • Il est flexible. Supposons un marin doit être différent une fois qu'il « niveaux up ». Il suffit de changer la méthode de Marine getSprite de prendre le niveau compte.

  • Il est la norme OO-idiome pour ce genre de chose, pour que les gens qui cherchent à leur code ne seront pas laissés se gratter la tête.

Autres conseils

Il est impossible qu'il soit statique dans la classe super. Cette variable statique dans la super classe est partagée (effectivement un singleton) par toutes les sous-classes. Chaque fois que vous changez que (disons, par instancier une sous-classe), ce changement se reflète dans tous les autres cas de sous-classe.

Au lieu de cela, le sprite statique dans les sous-classes, puis utiliser la structure de méthode décrite par Laurence.

J'ai eu la même question et je suis venu à la solution d'utiliser un mappage statique

Classe -.> Objet

L'exemple de code suivant utilise Entier que le type de la variable « classe statique » souhaitée.

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

La sortie est la suivante:

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

J'espère que cela aide quelqu'un. S'il vous plaît être gentil.

Alors faites un Sprite et donner à chacun les variables d'instance. Ils ne sont que des références; à peine plus que des pointeurs.

Un test rapide vous montrera que, oui, vous pouvez remplacer les variables statiques dans les sous-classes.

Je l'ai mis en place une structure d'héritage simple à tester. StaticTest est super de StaticTestSub. Ils ont tous deux déclarent ints statiques TEST1, TEST2 et TEST3 avec des degrés d'accès. Pour simplifier l'exemple, je suis parti sur la version 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;
}

Vous pouvez essayer à la maison. La eteint était:

  

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

Pour vos besoins spécifiques, cependant, je recommande l'approche adoptée par Laurence Gonsalves

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top