[英]Calling a method on object from it's class subclass
我試圖從類Weapon
調用一個方法,它是Item
的子類。 從字段中可以看到,我已將對象currentWeapon
聲明為Item的對象,在setCurrentWeapon
方法中,我使用getClass()
方法檢查Item
是否確實是Weapon的子類。
有沒有一種方法可以成功地從Item對象上的Weapon
類中調用方法(實際上是Weapon類)?
backpack
是一個包含Item
對象的hashmap。 如果我在字段中將currentWeapon
設置為Weapon
,則Weapon
對象不會添加到backpack
。
無法編譯的方法:(找不到符號-方法getMinDamage())
public int attack(Imperial currentEnemy) {
int damage = Utils.random(currentWeapon.getMinDamage(), currentWeapon.getMaxDamage()+1);
currentEnemy.changeHealth(-damage);
return damage;
}
場:
private Item currentWeapon;
設置currentWeapon的方法:
public boolean setCurrentWeapon(String itemToEquip) {
if(useItem(itemToEquip) == true) {
currentWeapon = backpack.get(itemToEquip.toLowerCase());
if(currentWeapon.getClass() == Weapon.class) {
System.out.println(getNick() + " has equipped " + currentWeapon.getName() + " as current weapon");
equipped = true;
return true;
}
else {
System.out.println(itemToEquip + " is not a weapon");
currentWeapon = null;
return false;
}
}
else System.out.println(itemToEquip + " is not owned by " + getNick());
return false;
}
我希望這個問題不要太令人困惑,請提供有關如何澄清是否有問題的提示
你的問題是當你打電話時
currentWeapon.getMinDamage()
currentWeapon
有類型Item
。 它的運行時類型是Weapon
,但是您收到一個關於它是錯誤類型的編譯時錯誤。 如果您希望該字段保持為Item
類型,則需要在調用該方法之前將其Weapon
轉換為Weapon
,以告訴編譯器您希望它確實為Weapon
類型:
((Weapon)currentWeapon).getMinDamage()
您可以使用instanceof Weapon
檢查Item
的類型,然后將Item
投射到Weapon
。
為您的Backpack
設計一個更好的設計可能是使它成為一個包含不同類型庫存的不同集合的類。 例如,您可以:
class Backpack {
List<Weapon> weapons;
List<Armor> armory;
List<Provision> provisions;
...
}
然后重載add
方法,以便將項添加到正確的集合。
如果您需要將背包中的所有物品視為通用Item
(例如,如果您需要獲得背包的總重量),那么這將使您可以靈活地遍歷所有集合,但仍保留不同的類型為方便起見,將Item
分開。
您可以使用instanceof
來檢查某個東西是否是類的實例。 在這種情況下,您可以使用:
Weapon a; Item b;
if(a instanceof Weapon) returns true
if(b instanceof Weapon) returns false
然后,您可以簡單地投射它。
instanceof
檢查其第一個參數中的對象是否屬於第二個參數的類型,因此可以安全地將其轉換為第二個參數的類型。 因此,如果一個物品是武器,它必須專門作為武器實例化。
因此, Weapon instanceof Item
也是如此。
代碼錯誤的原因是您正在調用Item上的僅武器功能。 你首先需要檢查你是否可以將物品投射到武器,然后施放它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.