我是否可以为每种不同类型的inheritance类使用静态变量的不同副本
我希望具有相同的静态变量,具有不同的值,具体取决于类的类型。
所以我会的
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
我不想在类的每个实例中存储相同的sprite。 我希望每种类型都有一个。 我想inheritance静态精灵变量和绘制精灵的绘制函数。 但我不希望Genstealer精灵覆盖Marine精灵。
这可能吗?
我该怎么办?
使用抽象方法:
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返回的精灵可以是静态的。 关于这种方法的好处:
-
你不能(轻易地)忘记在你的子类中包含一个sprite,因为如果你没有实现抽象方法,编译器会抱怨。
-
它很灵活。 假设海军陆战队员一旦“升级”就应该看起来不同。 只需更改Marine的getSprite方法即可将该级别考虑在内。
-
对于这类事情来说,它是标准的OO-idiom,所以看着他们的代码的人不会留下他们的头脑。
它不可能在超类中是静态的。 超类中的静态变量由所有子类共享(实际上是单例)。 无论何时更改它(例如,通过实例化子类),该更改都会反映在所有其他子类实例中。
相反,在子类中使sprite静态,然后使用Laurence描述的方法结构。
所以制作一个Sprite并给每个实例变量。 它们只是参考; 几乎没有指针。
快速测试将向您显示,是的,您可以覆盖子类中的静态变量。
我已经整理了一个简单的inheritance结构来测试它。 StaticTest是StaticTestSub的超级。 它们都声明了具有不同访问TEST3
静态内容TEST1
, TEST2
和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采用的方法