2013-12-12 5 views
0

У меня есть этот базовый абстрактный класс:Использование одного 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... 
} 

Тогда у меня есть еще несколько классов, которые inehrit от 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 likeand resourceId`.

Как я могу достичь этого? Если нет, какова будет альтернатива?

UPDATE

Оказалось, что я могу на самом деле поставить любой подкласс 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 Я могу преобразовать его обратно, но он убивает всю идею .... Я хочу указать на все игровые объекты, используя Ключ хэшмапа .... В данный момент я должен помнить, какой ключ ссылается к каким объектам:

GameObject obj = _hashMap.get(3); 
Snake snake = (Snake) obj; 

snake.getSnakeType();

+1

Хорошо, в чем проблема? –

+0

Вы используете 'HashMap ', вы всегда можете получить доступ к объекту значения, найдя его ключом. Пожалуйста, можете быть более конкретным? – Sage

+0

В вашем GameObject вы можете иметь поле 'protected static HashMap '. Что вы имеете в виду под одним HashMap? –

ответ

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 более подробно на модификаторы доступа в контексте наследования.

+0

Спасибо за ответ, можете ли вы проверить мое обновление на вопрос?> –

+1

, что обновление не имеет ничего общего с исходным вопросом ... если вы хотите работать со ссылками на змеи, тогда введите свой HashMap как и не . В противном случае вам будет полезно узнать, как программировать интерфейс, а не реализацию, - вот что я собираюсь сделать с вашим классом GameObject. Полиморфизм исследований, начиная с http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html. – whaley

Смежные вопросы