2016-11-05 30 views
0

這是一個叫做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的,因爲武器僅僅是項目的延伸。我也可以使用findItem()在HashMap中查找武器,但它將其作爲Item返回,而不是武器。這使得我不能使用武器子類中的getDamage()方法。有沒有人看到我的問題的快速解決方案?我很確定它遺漏了一些關於繼承的信息。

我試着寫這個方法,但它說,它無法轉化項目支招:

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

回答

0

你可以使用instanceof來理清武器的情況。例如:

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

謝謝!這爲我做了詭計。 Instanceof似乎是我忽略的東西。 – mRambech

0

除了什麼馬克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時,他們知道什麼類型的項目沒有看你的源代碼。

+0

很棒的建議!我會研究這個,儘管它對我來說是新的。似乎很簡單:) 感謝您的回覆! – mRambech

+0

@mRambech它可以變得更有趣,我希望它可以幫助。我還更新了我的答案,並提供了更多信息,爲什麼在您的案例中使用'Enum'非常重要。 –

相關問題