2016-11-05 11 views
0

これはPlayerと呼ばれるクラスの一部です。 findItem()は、アイテムをHashMapの "items"から返すために使用されるメソッドです。スーパークラスだけでなく、サブクラスでもこの検索方法を使用できますか?

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

この方法は現在まで問題なく機能しています。 今、WeaponというItemのサブクラスがあります。

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の項目のHashMapに武器を追加することができます。 findItem()を使ってHashMap内の武器を見つけることもできますが、武器ではなくアイテムとして返します。これは私が武器のサブクラスからgetDamage()メソッドを使用できないようにします。誰も私の問題の迅速な解決策を見ていますか?私はかなり確かにその何かが相続財産について不足しています。

私はこの方法を書いてみましたが、それはそれは武器にアイテムを変換することはできませんと言う:

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

答えて

0

あなたは武器のインスタンスを整理するためにinstanceofを使用することができます。また、あなたのゲームロジックが収まるアイテムの種類をチェックするために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; 
      // ... 
     } 
    } 
    // ... 
} 

:どのようなマークBidewellの答えに加えて

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

ありがとうございました!これは私のためのトリックでした。 Instanceofは私が見落としたことのようです。 – mRambech

0

、あなたがこのようなEnumと、それをより面白くすることができます。たとえば、プログラムのロバスト性を向上させ、他のプログラマーがAPIを使用するときには、ソースコードを見ずにどのような種類のアイテムが正確に分かるのです。

+0

素晴らしい提案!私はこれを見ていきますが、それは私の新しいものです。しかし、十分に簡単だと思われる:) 返信ありがとう! – mRambech

+0

@mRambechもっと面白いことがありますが、それが助けてくれることを願っています。私はあなたのケースで 'Enum'を使うことがなぜ大変重要なのかについて、私の答えをより多くの情報で更新しました。 –

関連する問題