Я столкнулся с проблемой дизайна в своем java-коде. В моем приложении используются ракеты, и есть разные типы ракет, которые работают одинаково, кроме трех уникальных атрибутов. Конструктор ракеты должен знать эти атрибуты. Я решил сделать ракеты абстрактным классом, но я не могу назначать значения защищенным переменным в подклассе вне метода/конструктора. Кроме того, я не могу объявить переменные в конструкторе, потому что сначала должен сделать вызов супер-конструктору. Как я могу быть умным в этой проблеме?Java как реализовать и разработать абстрактный класс
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;
}
}
И есть идеальная реализация подкласса, за исключением того, что он не работает. (он не может распознать защищенные переменные). Что я делаю?
public class Laser extends Missile {
MISSILE_SPEED = 2;
MISSILE_HEIGHT = 5;
file = "laser.jpg";
public Laser(int x, int y) {
super(x, y);
}
}
@ trevor-e Нет, компилятор по-прежнему запрашивает у них идентификатор – user2651804
, почему вы не задаете конструктор класса Missile, чтобы принять MISSILE_SPEED/MISSILE_HEIGHT. Они могут быть переданы из подклассов, но их не нужно открывать из конструкторов подкласса. –
@DevBlanked. Поскольку у меня есть только две разные ракеты, это избавит вас от необходимости вообще абстрагироваться. Я просто не думаю, что это очень хорошее решение, чтобы дать параметры ракеты 4 int. Я искал способ избежать этого. – user2651804