簡體   English   中英

從它的類子類調用對象上的方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM