将单个HashMap用于多个继承的类

时间:2013-12-12 01:42:04

标签: 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 = 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();

1 个答案:

答案 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