如果我的问题看起来有点模棱两可,我很抱歉,我知道以前有人问过我,但我的情况与我读到的有很大不同。
我正在寻找一个简单、简洁的解决方案,而不是一个复杂的解决方案。
我正在编写RPG代码,在开发库存/物品系统时遇到了一个障碍。以下是我的对象结构(不确定这是否是正确的术语(,首先是英语,其次是一些示例代码。
Player类具有Inventory类型的实例变量。
Inventory类有一个Item对象数组,表示库存槽中存储的项目。
物品类有武器、盔甲、魔药等子类。
我不知道玩家会有什么物品,所以库存是用物品对象初始化的,但当玩家拿起一把剑时,例如,一个新的武器(ID(对象被创建并存储在库存中,如果不对每个调用方法进行类型转换,我仍然无法访问武器变量或方法。这通常不会是太大的问题,但由于20多个Item子类共有100个不同的变量和方法,每次Typecast都需要大量的代码。
如果(你认为没有问题,这就是它的做法({
让我知道
}否则如果(你有更好的方法({
让我知道。
}
谢谢!
玩家--有--库存--有--物品--有孩子--武器/盔甲。
下面是一个剪辑,以显示我现在拥有什么。注意:每个类都有更多的变量和方法,只是显示了什么是重要的。
class Player {
private Inventory inventory = new Inventory();
public Item getInventoryItem(int slot){
return inventory.getItemFromSlot(slot);
}
}
class Inventory {
private Item[] item;
public Inventory() {
this.item = new Item[INVENTORY_SIZE];
}
public Item getItemFromSlot(int slot) {
return item[slot];
}
// called when i pick up ANY ITEM.
// having a addWeapon(Weapon weapon) would make no difference (see end of code)
public addItem(int slot, Item item) {
inventory[slot] = item;
}
}
class Item {
private int itemID;
private int itemType;
private String itemName;
public Item(int ID) {
this.itemID = ID;-
this.itemName = getItemName(ID); //access a database which holds all item data
this.itemType = getItemType(ID); //access a database holding all item types
}
}
class Weapon extends Item {
private int damage;
public Weapon(int ID) {
super(ID);
this.damage = getWeaponDamage(ID);
}
public getDamage(){
return damage;
}
}
PROBLEM:
class Game {
//lets assume i have picked up a Weapon and it is now stored in slot i, as a Weapon not as an Item.
int test = player.getInventoryItem(i).getDamage(); //doesn't work, even when the item (i) class IS weapon
int test = ((Weapon)player.getInventoryItem(i)).getDamage(); //works
}
如果你想访问特定于武器的方法或变量,你必须将Item list元素强制转换为武器,如果你想使用polymorphis,类项目必须具有该方法或变量。因此,它可以为每个项目调用。
在这种情况下强制转换是必要的,因为类Item
没有方法getDamage()
。调用getInventoryItem()
返回Item
,而不是Weapon
,因此父类对其子类的方法一无所知。一种可能的解决方案是使用这里提到的自类型模式:避免在继承的java类中进行强制转换
所以我自己一直在测试一些东西。因为编译器认为getInventoryItem()
将始终返回一个Item,所以不允许调用方法getDamage()
。但是,当getInventoryItem()
引用的对象是Weapon时,如果我简单地将int getDamage(){return -1}
添加为Item类的方法,我仍然可以从Weapon中获得正确的int damage
值,并从其他任何对象中获得-1。完美的