【问题标题】:How do i get this search method to work for sub-classes as well as the the super-class?我如何让这种搜索方法适用于子类和超类?
【发布时间】:2016-11-05 00:49:41
【问题描述】:

这是一个叫做 Player 的类的一部分。 findItem() 是用于从 HashMap“项目”返回项目的方法。

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;
}

}

我可以在 Player 中的 items HashMap 中添加一个 Weapon,因为 Weapon 只是 Item 的一个扩展。我还可以使用 findItem() 在 HashMap 中查找武器,但它会将其作为项目而不是武器返回。这使得我无法使用武器子类中的 getDamage() 方法。有没有人看到我的问题的快速解决方案?我很确定它在继承方面缺少一些东西。

我试过写这个方法,但它说它不能将物品转换为武器:

public Weapon findWeapon(String search){
    for (Weapon weapon : items.values()){
        something somthing
     }
}

【问题讨论】:

    标签: java inheritance methods


    【解决方案1】:

    您可以使用 instanceof 来整理 Weapon 实例。例如:

    public Weapon findWeapon(String search){
      for (Item item : items.values()) {
        if(weapon instanceof Weapon) {
          Weapon weapon = (Weapon)item;
          <something somthing>
        }
      }
    }  
    

    【讨论】:

    • 谢谢!这对我有用。 Instanceof 似乎是我忽略的东西。
    【解决方案2】:

    除了 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 时,他们无需查看您的源代码即可确切知道有哪些物品。

    【讨论】:

    • 好建议!我会调查这个,虽然它对我来说是新的。不过看起来很简单 :) 感谢您的回复!
    • @mRambech 它可以变得更有趣,我希望它有所帮助。我还更新了我的答案,提供了更多信息,说明为什么在您的情况下使用 Enum 非常重要。
    猜你喜欢
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 2011-12-08
    相关资源
    最近更新 更多