Java如何实现和设计抽象类

标签 java abstract protected

我的 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/

相关文章:

java - Firestore-检查用户名是否已存在

java - Websphere中的这些线程池有什么区别?

java - 关于抽象类的两个概念让我困惑

objective-c - 仅限类及其子类的属性

Java:instanceof 或自定义 getType

java - 简单日期格式解析异常 : Unparseable date Error

java - Java 抽象类和接口(interface)

java - 抽象类/方法实现

objective-c - @protected 在 Objective-C 中

c++ - 派生类中 protected 成员函数地址不可访问