从它的类子类调用对象上的方法

时间:2013-04-10 16:08:04

标签: java superclass

我正在尝试从类Weapon调用一个方法,该类是Item的子类。正如您在字段中看到的那样,我已将对象currentWeapon声明为Item的对象,并在setCurrentWeapon方法中使用getClass()方法检查Item实际上是武器的子类。

有没有办法可以在我的Item对象(实际上是Weapon类)中成功调用Weapon类中的方法?

backpack是一个包含Item个对象的散列图。如果我在字段中将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;
}

我希望这个问题不会太混乱,请提供一些如何澄清问题的提示

3 个答案:

答案 0 :(得分:4)

你的问题是,当你打电话

currentWeapon.getMinDamage()

currentWeapon的类型为Item。它的运行时类型是Weapon,但是你得到一个关于它是错误类型的编译时错误。如果您希望该字段保持Item类型,则需要在调用该方法之前将其强制转换为Weapon,以告诉编译器您希望它实际上属于{{1}类型}:

Weapon

答案 1 :(得分:2)

您可以使用Item检查instanceof Weapon的类型,然后将Item投放到Weapon

Backpack设计一个更好的设计可能是让它成为一个包含不同类型库存的不同集合的类。例如,您可以:

class Backpack {
    List<Weapon> weapons;
    List<Armor> armory;
    List<Provision> provisions;
    ...
}

然后重载add方法,以便将项目添加到正确的集合中。

如果您需要将背包中的所有物品视为通用Item(例如,如果您需要获得背包的总重量),那么这将使您可以灵活地遍历所有集合),但为方便起见,仍然将不同类型的Item分开。

答案 2 :(得分:1)

您可以使用instanceof检查某些内容是否是某个类的实例。在这种情况下,您可以使用:

Weapon a; Item b;
if(a instanceof Weapon) returns true
if(b instanceof Weapon) returns false

然后,你可以简单地施展它。

instanceof检查第一个参数中的对象是否属于第二个参数的类型,因此可以安全地在第二个参数中强制转换该类型。因此,如果一个物品是武器,它必须专门作为武器实例化。

因此,Weapon instanceof Item也是如此。

代码中出错的原因是你在Item上调用了Weapon-only函数;你首先需要检查你是否可以将物品投射到武器,然后施放它。