2017-10-15 68 views
2

我有以下的抽象類:Java的抽象類常數

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還包含常數WIDTHHEIGHT。我想爲應該使用這些常量的所有遊戲對象添加方法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?問題是我不能初始化裏面的WIDTHHEIGHT,因爲它們在子類中是不同的。

回答

2

在抽象類GameObject

public abstract Bar getBar() 

定義抽象方法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); 
} 
+0

感謝一個全面的答案。 – Russiancold

+0

@Russiancold:查看備選更新 – rkosegi