いただきたいのですが、可能で異なるコピーの静的変数毎に異なるタイプのクラスを継承

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

質問

たいてい同じ静的変数の異なる価値の種類によってクラスです。

思い

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
{

}

そして私の主なプログラム:

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

い店舗と同じスプライト毎のインスタンスのクラスです。たい各種のクラスです。いを受け継ぐ静的スプライト変数の機能を引き出するスプライト.私たいと思っているGenstealerスプライトをオーバーライド海のスプライト.

可能ですか?

そこまでするの?

役に立ちましたか?

解決

使用する抽象メソッド:

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

のスプライトで返されるgetSpriteできる静的に適用されています。良いところはこのアプローチ:

  • できません(容易に)を忘れなどのスプライトサブクラスで、以降のコンパイラを訴えない場合の実行抽象的。

  • この柔軟性があります。例えば、海洋にするべきであなた"のレベルとさせていただきますを変えるだけの海洋のgetSprite法のレベル。

  • この標準のOO-熟のためこのようなものでをお迎えする存在感あるコードな左傷部位です。

他のヒント

それは、スーパークラスの静的であるためにはことはできません。スーパークラス内のその静的変数は全てのサブクラスで(有効シングルトン)共有されています。いつでもあなたが(たとえば、サブクラスをインスタンス化することによって)、その変更が他のすべてのサブクラスのインスタンスに反映されていること。

変更

の代わりに、サブクラスでスプライトは、静的行い、その後、ローレンスによって記載された方法の構造を使用します。

私は、同じ質問を持っていたし、静的マッピングを使用するために溶液に来ました。

クラス - >オブジェクト

次のコード例は、所望の「クラス静的」変数の型として、整数を使用します。

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

出力されます:

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

私は、これは誰かに役立ちます願っています。親切にしてください。

だから、1つのスプライトを作成し、全員のインスタンス変数を与えます。彼らはただの参照です。ポインタよりほとんどよります。

簡単なテストでは、はい、あなたはサブクラスで静的変数を上書きすることができ、ことが示されます。

私はこれをテストするために一緒に簡単な継承構造を入れています。 StaticTestはStaticTestSubのスーパーです。これらは両方とも、静的なint型のTEST1TEST2、およびアクセスの様々な程度でTEST3を宣言します。例を簡素化するために、私は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;
}

あなたは自宅でこれを試すことができます。アウトプットだっます:

  

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

、特定のニーズのために、しかし、私はローレンス・ゴンサルベスで撮影したアプローチをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top