我有这个基础抽象类:
public abstract class GameObject {
private int _position;
private int _resourceId;
private ObjectType _objectType;
public GameObject(ObjectType type, int position, int resourceId){
_objectType = type; _position = position; _resourceId = resourceId;
}
public ObjectType getObjectType(){
return _objectType;
}
//Some more methods...
}
然后我还有一些来自GameObject
:
public class Snake extends GameObject{
private SnakeType _snakeType;
public Snake(ObjectType type, int position, int resourceId, SnakeType snakeType){
super(type, position, resourceId);
_snakeType = snakeType;
}
public SnakeType getSnakeType(){
return _snakeType;
}
public int getDamage(){
return _snakeType.getMask();
}
}
public class Home extends GameObject{
public Home(ObjectType type, int position, int resourceId) {
super(type, position, resourceId);
}
}
我的问题是,我必须在HashMap<Integer, GameObject>...so I Can have access to theire shared members like
位置and
resourceId`中收集这些对象。
我怎么能做到这一点?如果没有,会有什么替代方案?
更新
事实证明,我实际上可以在GameObject
中放置HashMap
的任何子类。
int id = 1;
_hashMap.put(id++, new Home(ObjectType.HOME, id -1, resHome ));
_hashMap.put(id++, new Normal(ObjectType.NORMAL, id -1, resNormal));
_hashMap.put(id++, new Snake(ObjectType.SNAKE, id -1, resSnakeOne, SnakeType.A));
但是现在当我想要收回物品时,我遇到问题:
Snake snake = _hashMap.get(3);
编译器抱怨它应该找到GameObject
而不是Snake
...这里的问题是什么?
我在另一个类(在继承自BaseAdapter的类中)中有哈希映射,我想将所有对象添加到此hashmap中,以便稍后我可以将getView
的对象的位置和资源作为drawable提供
使用CAST我可以将其转换回来,但它会杀死整个想法....我想使用hashmap的Key指向所有游戏对象....此刻我必须记住哪个Key指的是哪种对象:
GameObject obj = _hashMap.get(3);
Snake snake = (Snake) obj;
snake.getSnakeType();
答案 0 :(得分:0)
您需要公开具有比私有更高可见性的共享成员 - 这是您当前可见的_position和_resourceId字段。这意味着这些字段只在GameObject类中可见 - 甚至GameObject的子类都不能访问它们,更不用说GameObject引用的客户端了。
理想情况下,您应该将其视为具有部分实现的接口的超类将为要向任何GameObject实现的客户端公开的属性提供一些访问器方法。如果您希望将这些属性公开给程序中的任何类,我建议将以下内容添加到GameObject中,包括Map
的客户端
public int getPosition(){
return _position;
}
public int getResourceId(){
return _resourceId;
}
有关继承上下文中访问修饰符的更多详细信息,请参阅http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html。