我目前正在做一些学校项目;我们正在开发一个简单的RPG,但我似乎在质疑我的一些Java代码。
我有一个名为Abstract
的{{1}}课程,然后我有Item
和Armor
个类,这两个类都继承自Weapon
。 Item
和Armor
都有一些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没有问题,但是找不到类中的方法。
我是否真的需要同时创建武器和护甲对象,并在类型后返回?
答案 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
变量,你可以将weapon
或armor
分配到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