Javaコードで設計上の問題が発生しました。私のアプリケーションはミサイルを使用しており、3つの固有の属性があることを除いて、すべて同じように機能するさまざまなタイプのミサイルがあります。ミサイルのコンストラクターはこれらの属性を知っている必要があります。ミサイルを抽象クラスにすることにしましたが、メソッド/コンストラクターの外部のサブクラスで保護された変数に値を割り当てることができません。また、最初にスーパーコンストラクターを呼び出さなければならないため、コンストラクターで変数を宣言することはできません。どうすればこの問題について賢くなりますか?
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);
}
}
基本クラスのフィールドとコンストラクターをに変更します
protected final int speed;
protected final int height;
public Missile(int x, int y, int speed, int height, String file) {
ImageIcon ii =
new ImageIcon(this.getClass().getResource(file));
image = ii.getImage();
visible = true;
this.speed = speed;
this.height = height;
this.x = x;
this.y = y - Math.floor(height/2);
}
そしてサブクラスは:
public class Laser extends Missile {
public Laser(int x, int y) {
super(x, y, 2, 5, "laser.jpg");
}
...
}
属性はすでに基本クラスにあるため、サブクラスで再定義しないでください。すべて大文字の命名は、Javaの定数に予約されています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加