У меня есть список предметов, и из этого списка я хочу извлечь предметы, которые являются оружием. Оружие расширяет Предметы, но имеет еще один метод: getBonus()
, который дает игроку дополнительный урон.
Теперь я могу достаточно легко извлечь предметы, которые являются оружием, используя instanceof. Я прогоняю их через цикл for
на основе индексов, и если это оружие, я его извлекаю. Однако я не могу вызвать метод оружия для этого элемента Item в списке, который, как я знаю, является оружием из-за instanceof
, потому что он имеет тип «Предмет», а не «Оружие».
Я относительно новичок в кодировании, и поэтому, вероятно, есть много решений, которые я не пробовал из-за недостатка знаний. Я пробовал приведение типов, но это не сработало.
for(int i = 0; i < backpack.size(); i++) {
if(backpack.get(i) instanceof Sword) {
IItem item = backpack.get(i);
backpack.remove(i);
equipped = item;
initialDmg += equipped.getBonus();
checkInventory(game);
game.formatMessage("You equipped a %s, and now hit for %d dmg!", item.getName(), getDamage());
}
}
Линия
equipped.getBonus();
не работает, потому что оснащены типом IItem, а метод getBonus();
взят из интерфейса Weapons, который расширяет интерфейс IItem. Sword — это класс, реализующий интерфейс оружия.
Я хочу иметь возможность вызывать метод getBonus()
из элементов, являющихся экземплярами оружия, но я не знаю, как это сделать с помощью этого цикла for?
Мне кажется, это потому, что список, который я просматриваю, состоит из IItem-элементов. Однако я не могу изменить его так, чтобы он состоял исключительно из элементов оружия, потому что в рюкзаке должны быть как обычные предметы, так и оружие. Как уже говорилось, некоторые элементы-Предметы являются Оружием.
Как я могу заставить элемент с индексом i использовать метод оружия, когда экземпляр оружия (в данном случае меч), даже если это элемент типа Item?
Sword
, чтобы использовать методы этого класса. - person Mike   schedule 26.03.2019backpack.remove(i);
удаляет элемент из списка, но вы также не уменьшаетеi
— это означает, что вы пропустите следующий элемент. - person Andy Turner   schedule 26.03.2019