Java 对多个继承类使用单个HashMap
我有一个基本抽象类:Java 对多个继承类使用单个HashMap,java,inheritance,hashmap,Java,Inheritance,Hashmap,我有一个基本抽象类: public abstract class GameObject { private int _position; private int _resourceId; private ObjectType _objectType; public GameObject(ObjectType type, int position, int resourceId){ _objectType = type; _position =
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中收集这些对象……这样我才能访问它们的共享成员,比如position和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继承的类中)中有哈希映射,我想将所有对象添加到此哈希映射,以便以后可以为getView
提供可绘制的对象位置和资源
使用CAST我可以将其转换回来,但它扼杀了整个想法……我想使用hashmap的键指向所有游戏对象……此时我必须记住哪个键指向哪种对象:
GameObject obj = _hashMap.get(3);
Snake snake = (Snake) obj;
snake.getSnakeType() 您需要以比private更高的可见性公开共享成员-这就是您当前在上可见的_position和_resourceId字段。这意味着这些字段仅在GameObject类中可见-甚至GameObject的子类都无法访问它们,更不用说GameObject引用的客户端了
理想情况下,您的超类(您应该将其视为部分实现的接口)将具有一些访问器方法,用于您希望向任何游戏对象实现的客户端公开的属性。如果您希望将这些属性公开给程序中的任何类,包括Map
public int getPosition(){
return _position;
}
public int getResourceId(){
return _resourceId;
}
有关继承上下文中访问修饰符的更多详细信息,请参阅。好的,那么问题出在哪里?您使用的是HashMap
您始终可以通过键查找值对象来访问它。请你能说得更具体一点吗?你的游戏对象中可以有一个受保护的静态HashMap
字段。你所说的单个HashMap到底是什么意思?“现在我必须记住哪个键指向哪种对象”-这就是为什么会有instanceof
。为什么写GameObject obj=HashMap.get还不够代码>?写了这些之后,你可以做一些事情,比如obj.getPosition()
(如果你写了这样一个方法),obj.getResourceId()
等等——你在GameObject
类中列出的任何事情。你不能做的事情是那些只存在于一个子类或另一个子类中的方法。如果您在GameObject
类中声明了一个方法(可能是抽象的),并在每个子类中分别实现,那么您也可以使用它。所以你真的没有什么限制。谢谢你的回复,你能检查一下我对这个问题的更新吗?>这个更新与原来的问题没有任何关系。。。如果要使用特定于Snake的引用,请键入HashMap作为而不是。否则,在你的情况下,学习如何编程到一个接口而不是一个实现是很有帮助的——我想这就是你想要用你的GameObject类做的。首先研究多态性。