我的 java 代码遇到了设计问题。我的应用程序使用导弹,有不同类型的导弹,除了具有 3 个独特的属性外,它们的工作原理都相同。导弹的制造者必须了解这些属性。我决定将导弹设为抽象类,但我无法为方法/构造函数之外的子类中的 protected 变量赋值。另外,我无法在构造函数中声明变量,因为我必须首先调用 super 构造函数。 我怎样才能聪明地解决这个问题?
public abstract class Missile {
private int x, y;
private Image image;
boolean visible;
private final int BOARD_WIDTH = 390;
protected final int MISSILE_SPEED;
protected final int MISSILE_HEIGHT;
protected String file;
public Missile(int x, int y) {
ImageIcon ii =
new ImageIcon(this.getClass().getResource(file));
image = ii.getImage();
visible = true;
this.x = x;
this.y = y - Math.floor(MISSILE_HEIGHT/2);
}
public Image getImage() {
return image;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public boolean isVisible() {
return visible;
}
public void move() {
x += MISSILE_SPEED;
if (x > BOARD_WIDTH)
visible = false;
}
}
并且有一个子类的理想实现,但它不起作用。 (它无法识别 protected 变量)。我该怎么办?
public class Laser extends Missile {
MISSILE_SPEED = 2;
MISSILE_HEIGHT = 5;
file = "laser.jpg";
public Laser(int x, int y) {
super(x, y);
}
}
最佳答案
我认为做你想做的事情的最好方法是在 Missile 中创建子类必须实现的抽象方法。例如,将这些添加到 Missile:
public abstract int getMissileSpeed();
public abstract int getMissileHeight();
public abstract int getFileName();
然后你的子类必须实现它,并且你可以像这样使其恒定:
public class Laser extends Missile {
public Laser(int x, int y) {
super(x, y);
}
public int getMissileSpeed() {
return 2;
}
public int getMissileHeight() {
return 5;
}
public String getFileName() {
return "laser.jpg";
}
}
编辑:当然,在任何您想要检索常量值的地方,您只需调用这些方法即可。
关于Java如何实现和设计抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19732034/