[英]Java abstract class constants
我有以下抽象類:
public abstract class GameObject {
protected final GameSession session;
protected final int id;
protected Point position;
public GameObject(GameSession session, Point position) {
this.position = position;
this.id = session.getNewId();
this.session = session;
}
public void setPosition(Point position) {
this.position = position;
}
public int getId() {
return id;
}
public Point getPosition() {
return position;
}
每個gameObject
還包含常量WIDTH
和HEIGHT
。 我想為所有應該使用這些常量的游戲對象添加方法getBar()
。 這是一個游戲對象的例子:
public class Wall extends GameObject {
private static final Logger logger = LogManager.getLogger(Wall.class);
private static final int WIDTH = 32;
private static final int HEIGHT = 32;
public Wall(GameSession session, Point position) {
super(session, position);
logger.info("New Wall id={}, position={}", id, position);
}
和getbar()
如果它在Wall
類中:
public Bar getBar() {
return new Bar(position, position.getX() + WIDTH, position.getY() + HEIGHT);
}
我應該如何正確實現GameObject
? 問題是我不能只在內部初始化WIDTH
和HEIGHT
,因為它們在子類中是不同的。
在抽象類中定義抽象方法getBar() GameObject
public abstract Bar getBar()
然后所有擴展GameObject
類都必須實現它們。 因此,例如Wall
類將有方法
@Override
public Bar getBar() {
return new Bar(position, position.getX() + WIDTH, position.getY() + HEIGHT);
}
或者,您可以在GameObject
中創建構造函數,該構造函數也將采用這些常量,然后您可以進行單個方法調用(無需覆蓋它):
public abstract class GameObject {
protected final GameSession session;
protected final int id;
protected Point position;
protected final width;
protected final height;
public GameObject(GameSession session, Point position, int width, int height) {
this.position = position;
this.id = session.getNewId();
this.session = session;
this.width = width;
this.height = height;
}
public Bar getBar() {
return new Bar(position, position.getX() + width, position.getY() + height);
}
}
然后在你的Wall
課上
public Wall(GameSession session, Point position) {
super(session, position, 32, 32); //Added WIDTH and HEIGHT
logger.info("New Wall id={}, position={}", id, position);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.