Получение экземпляра подкласса из другого класса - PullRequest
0 голосов
/ 27 декабря 2011

Я пишу игру с использованием гладкого 2D-движка и моего собственного движка сущностей, чтобы проработать детали 2D-бокового скроллера

То, как мой код работает в настоящее время, выглядит так:Класс сущности содержит информацию о сущности.У него может быть Способность, что-то вроде Анимации, звука или движения.Все способности являются подклассами абстрактного класса с именем Ability.

У меня есть метод в классе Entity, где я хочу получить экземпляр определенной способности, чтобы я мог использовать его методы:

 public Ability getAbility(String id) {
    for(Ability abil : ablitites) {
        if(abil.getId().equalsIgnoreCase(id)) {
            return abil;
        }
    }
    return null;
}

Однако, это возвращает только конкретный экземпляр суперкласса, Ability.Я хочу получить экземпляр подкласса из другого пакета или класса.

Пример кода, который делает это, будет принята с благодарностью.Спасибо

Ответы [ 2 ]

0 голосов
/ 27 декабря 2011

Я думаю, ваш код уже делает то, что вы хотите. Если ваша коллекция ablitites уже содержит экземпляры объектов Animation, Sound и Movement, то это то, что вернет ваш метод. Он просто возвращает их через Ability ссылку . Он не может вернуть экземпляр суперкласса Ability, так как это абстрактный класс. Вы должны иметь возможность вызывать общие методы, объявленные в Ability, и видеть, что объекты, возвращаемые вашим методом, ведут себя как экземпляры определенных подклассов, которые вы запрашиваете.

0 голосов
/ 27 декабря 2011

Я не до конца понимаю ваш вопрос, но думаю, вам стоит взглянуть на Кастинг .

Я думаю, вы должны использовать свой код следующим образом:
(Конечно, я понятия не имею о твоем дизайне, поэтому я немного догадываюсь)

Ability ability = getAbility("moveLeft");
if (ability instanceof MoveAbility)
{
    // Right here, we know it IS a MoveAbility because we checked it with
    // instanceof

    // So, we can cast it to a MoveAbility.
    MoveAbility moveAbility = (MoveAbility) ability;
    moveAbility.execute();
}
...