2016-11-05 2 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이라는 하위 클래스가 있습니다. 무기 아이템의 단지 연장이기 때문에 나는 플레이어의 항목되는 HashMap에 무기를 추가 할 수 있습니다

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

}. findItem()을 사용하여 HashMap에서 무기를 찾을 수도 있지만, 무기가 아니라 Item으로 반환합니다. 이것은 내가 무기 하위 클래스에서 getDamage() 메서드를 사용할 수 없도록 만듭니다. 누구든지 내 문제에 대한 빠른 해결책을 볼 수 있습니까? 임씨는 상속에 대해 뭔가 빠져 있음을 확신합니다.

나는이 방법을 작성했지만, 그것이 무기로 항목을 변환 할 수 없습니다 말한다 :

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

답변

0

당신은 무기 인스턴스을 제압 instanceof를 사용할 수 있습니다. 예를 들어 :

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 사용 :

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와 더 재미있게 만들 수 있습니다 프로그램을보다 강력하게 만들고 다른 프로그래머가 API를 사용할 때 소스 코드를 보지 않고도 어떤 종류의 항목이 있는지 정확히 알 수 있습니다.

+0

큰 제안! 나는 이것에 대해 조사 할 것이다. 충분히 간단하게 보이지만 :) 답장을 보내 주셔서 감사합니다! – mRambech

+0

@mRambech 더 재미있을 수 있습니다. 도움이되기를 바랍니다. 나는 또한 당신의 경우에'열거 형 '을 사용하는 것이 왜 중요한지 더 많은 정보로 나의 대답을 업데이트했다. –

관련 문제