Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对多个继承类使用单个HashMap_Java_Inheritance_Hashmap - Fatal编程技术网

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类做的。首先研究多态性。