无法在课堂上调用方法

时间:2011-11-13 14:36:52

标签: java inheritance

我目前正在做一些学校项目;我们正在开发一个简单的RPG,但我似乎在质疑我的一些Java代码。

我有一个名为Abstract的{​​{1}}课程,然后我有ItemArmor个类,这两个类都继承自WeaponItemArmor都有一些Weapon没有的属性。

所以在我的数据库包装器中,我有一个Item方法,它获取统计信息并创建我的类的实例(在代码中读取注释):

loaditem

public Item loadItem(int itemID) { // Setting item, as a Item, as it can be both Weapon or Armor Item item; try { // Build prepared statement PreparedStatement stmt = con.prepareStatement("SELECT * FROM item WHERE iid = ?"); // Set Parameter stmt.setInt(1, itemID); // Execute the query ResultSet rs = stmt.executeQuery(); // Get row rs.first(); // Set all values and keys if(rs.getString("type").equals("weapon")) { item = new Weapon(); // SetDamage is unique to Weapon, and setDefense to armor item.setDamage(); }else { item = new Armor(); item.setDefense() } item.setIid(rs.getInt("iid")); item.setName(rs.getString("name")); item.setDescription(rs.getString("description")); item.setSellValue(rs.getInt("sellvalue")); item.setBuyValue(rs.getInt("buyvalue")); item.setStrength(rs.getInt("strength")); item.setAgility(rs.getInt("agility")); item.setEndurance(rs.getInt("endurance")); Weapon的实例设置为item没有问题,但是找不到类中的方法。

我是否真的需要同时创建武器和护甲对象,并在类型后返回?

5 个答案:

答案 0 :(得分:3)

是的,如果您要调用实例方法,则方法调用的“target”表达式必须具有编译时类型,已知该类型具有适当的方法。编译器需要在编译时解析方法调用 。 (任何重载解析都是在编译时完成的;实际的实现是在执行时根据多态性决定的。)

目前还不清楚为什么你首先想要item变量。听起来你应该只有:

if (rs.getString("type").equals("weapon")) { 
    Weapon weapon = new Weapon();
    weapon.setDamage();
    return weapon;
} else {
    Armor armor = new Armor();
    armor.setDefense();
    return armor;
}

假设你想立即返回 - 你的代码被截断了,所以还不清楚。如果你真的需要item变量,你可以将weaponarmor分配到item,其中我有上面的返回语句。< / p>

编辑:听起来就是这样,所以你有:

// I'd still declare `item` as late as possible, i.e. here rather than
// outside the `try` block, unless you *also* need it outside the try block...
Item item;
if (rs.getString("type").equals("weapon")) { 
    Weapon weapon = new Weapon();
    weapon.setDamage();
    item = weapon;
} else {
    Armor armor = new Armor();
    armor.setDefense();
    item = armor;
}
// Other code using `item` here

实际上,您可能希望将代码初始化为单独的方法。然后你可以使用:

String type = rs.getString("type");
Item item = type.equals("weapon")) ? createWeapon() : createArmor();

答案 1 :(得分:3)

你可以这样做:

    if (...) {
      Weapon w = new Weapon();
      // SetDamage is unique to Weapon, and setDefense to armor  
      w.setDamage();
      item = w;
    } else {
      ...
    }

if块/序列之后,您可以在返回之前使用item。但是你只能调用Item类的方法。同样,loadItem方法的调用者只能使用Item类中返回值的方法,除非他们小心使用强制转换。

答案 2 :(得分:0)

为了调用“武器”独有的方法,必须将项目指针强制转换为武器,因此:

Weapon weaponPointer = (Weapon)item;
weaponPointer.setDamage();

答案 3 :(得分:0)

item = new Weapon()会让物品引用武器实例,但物品不会成为武器,为了引用武器装甲方法你可以做以下其中一种:

if (rs.getString("type").equals("weapon")) { 
   Weapon weapon = new Weapon();
   weapon.setDamage();
   return weapon;
} else {
   Armor armor = new Armor();
   armor.setDefense();
   return armor;

}

if (rs.getString("type").equals("weapon")) { 
item = new Weapon();
((Weapon)item).setDamage();
} else {
item = new Armor();
((Armor)item).setDefense();
}

返回商品

答案 4 :(得分:0)

您应该区分实例类型和引用类型;

Item myItem = new Weapon();

实例类型:武器 参考类型:项目

因此,如果在myItem上调用方法,则它只能是Item类的方法。因为您的引用类型是Item。

在你的情况下,你想调用一个武器方法,所以你的引用类型也必须是武器。

Weapon myWeapon = new Weapon();
item.setDamage(); // method of Weapon class, it's ok

注意引用类型和实例类型!

我认为这个答案是最好的:(感谢Jon Skeet)

// I'd still declare `item` as late as possible, i.e. here rather than
// outside the `try` block, unless you *also* need it outside the try block...
Item item;
if (rs.getString("type").equals("weapon")) { 
    Weapon weapon = new Weapon();
    weapon.setDamage();
    item = weapon;
} else {
    Armor armor = new Armor();
    armor.setDefense();
    item = armor;
}
// Other code using `item` here