2017-10-15 67 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