我如何让这个搜索方法适用于子类以及超类?

时间:2016-11-05 00:49:41

标签: java inheritance methods

这是一个名为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
     }
}

2 个答案:

答案 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时,他们完全知道有什么类型的项目而不查看您的源代码