8

クラスのタイプに応じて異なる値を持つ同じ静的変数が必要です。

だから私は

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

クラスのすべてのインスタンスに同じスプライトを格納したくありません。クラスの種類ごとに1つ欲しいです。静的スプライト変数と、スプライトを描画する描画関数を継承したいと思います。しかし、私はGenstealerスプライトがMarineスプライトをオーバーライドすることを望んでいません。

これは可能ですか?

どうすればいいですか?

4

5 に答える 5

14

抽象メソッドを使用します。

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 によって返されるスプライトは、必要に応じて静的にすることができます。このアプローチの良い点:

  • 抽象メソッドを実装しないとコンパイラが文句を言うので、サブクラスにスプライトを含めることを (簡単に) 忘れることはできません。

  • 柔軟です。海兵隊が「レベルアップ」すると見た目が変わるとします。Marine の getSprite メソッドを変更して、レベルを考慮に入れるだけです。

  • これは、この種の標準的な OO イディオムであるため、コードを見ている人が頭を悩ませることはありません。

于 2009-09-19T08:12:56.513 に答える
1

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

代わりに、スプライトをサブクラスで静的にしてから、Laurence によって記述されたメソッド構造を使用します。

于 2009-09-19T16:06:35.867 に答える
0

スプライトを 1 つ作成し、全員にインスタンス変数を与えます。それらは単なる参照です。ポインターにすぎません。

于 2009-09-19T08:11:24.517 に答える
-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

ただし、特定のニーズについては、Laurence Gonsalves のアプローチをお勧めします

于 2009-09-19T14:09:49.920 に答える