我希望根据类的类型使用不同的静态变量。
所以我会
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。我希望每种类型都有一个。我想继承静态精灵变量和绘制精灵的绘制函数。但是我不希望Genstealer精灵覆盖Marine精灵。
这可能吗?
我该怎么做?
答案 0 :(得分:13)
使用抽象方法:
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习惯用法,所以看着他们代码的人不会留下挠头。
答案 1 :(得分:1)
它不可能在超类中是静态的。超类中的静态变量由所有子类共享(实际上是单例)。无论何时更改它(例如,通过实例化子类),该更改都会反映在所有其他子类实例中。
相反,在子类中使sprite为静态,然后使用Laurence描述的方法结构。
答案 2 :(得分:1)
我有一个相同的问题,来到解决方案中使用静态映射
类->对象。
下面的代码示例将Integer用作所需的“类静态”变量的类型。
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
我希望这对某人有帮助。请客气。
答案 3 :(得分:0)
所以制作一个Sprite并给每个实例变量。它们只是参考;几乎没有指针。
答案 4 :(得分:-1)
快速测试会告诉您,是的,您可以覆盖子类中的静态变量。
我已经整理了一个简单的继承结构来测试它。 StaticTest是StaticTestSub的超级。他们都声明了具有不同访问级别的静态整数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采用的方法