这是一个名为Player的类。 findItem()是用于从HashMap" items"中返回Item的方法。
public class Player extends Character {
private String type;
private int carryWeight;
private HashMap<String, Item> items;
public Item findItem(String search) {
return this.items.get(search);
}
此方法一直运作良好。 现在,我有一个Item的子类,名为Weapon。
public class Weapon extends Item{
private int damage;
public Weapon(String name, String description, String action, int value, int weight, int damage){
super(name, description, action, value, weight);
this.damage = damage;
}
public int getDamage(){
return damage;
}
}
我可以在玩家的HashMap中添加一个武器,因为武器只是Item的扩展。我也可以使用findItem()在HashMap中找到武器,但它将它作为Item而不是Weapon返回。这使得我无法使用武器子类中的getDamage()方法。有没有人看到我的问题的快速解决方案?我非常肯定它遗传的东西很少。
我尝试编写此方法,但它说它无法将项目转换为武器:
public Weapon findWeapon(String search){
for (Weapon weapon : items.values()){
something somthing
}
}
答案 0 :(得分:0)
您可以使用instanceof来排序Weapon实例。例如:
public Weapon findWeapon(String search){
for (Item item : items.values()) {
if(weapon instanceof Weapon) {
Weapon weapon = (Weapon)item;
<something somthing>
}
}
}
答案 1 :(得分:0)
除了Mark Bidewell的答案之外,您可以使用Enum
这样更有趣:
public class Item {
// ...
// ...
public enum ItemType {
WEAPON, ARMOR, FOOD, ITEM;
}
public ItemType getItemType() {
return ItemType.ITEM;
}
}
class Weapon extends Item {
private int damage;
public Weapon(String name, String description, String action, int value, int weight, int damage) {
super(name, description, action, value, weight);
this.damage = damage;
}
public int getDamage() {
return damage;
@Override
public ItemType getItemType () {
return ItemType.WEAPON;
}
}
// you can just cast like this
public Weapon findWeapon(String search) {
for (Item item : items.values()) {
if (item.getItemType().equals(ItemType.WEAPON)) {
Weapon weapon = (Weapon) item;
// ...
}
}
// ...
}
使用Enum
检查哪种项目也适合您的游戏逻辑,使程序更加强大,当其他程序员使用您的API时,他们完全知道有什么类型的项目而不查看您的源代码