[英]Accessing Child class instance method from Parent type child class object Java
如果我的問題看起來有點模棱兩可,我深表歉意,我知道之前有人問過它,但我的情況與我讀過的有很大不同。
我正在尋找一個簡單、優雅的解決方案,而不是一個復雜的解決方法。
我正在編寫 RPG 代碼,在處理庫存/物品系統時遇到了障礙。 這是我的英語對象結構(不確定這是否是正確的術語),然后是一些示例代碼。
Player 類有一個 Inventory 類型的實例變量。
Inventory 類有一個 Item 對象數組,表示存儲在庫存槽中的項目。
Item 類有子類,例如 Weapon、Armor、Potion 等。
我不知道玩家將擁有什么物品,所以庫存是用 Item 對象初始化的,但是當玩家拿起一把劍時,例如一個新的武器(ID)對象被創建並存儲在庫存中,我仍然可以'無需對每個調用方法進行類型轉換即可訪問武器變量或方法。 這通常不會成為太大的問題,但是有 20 多個 Item 子類,總共有 100 個不同的變量和方法,每次 Typecast 所需的代碼都是巨大的。
如果(你看沒有問題,這就是它的完成方式){
讓我知道
} else if(你有更好的方法){
讓我知道。
}
謝謝!
玩家--擁有--庫存--擁有--物品--擁有孩子--武器/盔甲。
下面是一個剪輯,以顯示我現在所擁有的。 注意:每個類都有明顯更多的變量和方法,僅顯示重要的內容。
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 列表元素強制轉換為武器,如果要使用多態,則類項必須具有該方法或變量,因此可以為每個項調用它。
在這種情況下, getDamage()
轉換是必要的,因為Item
類沒有方法getDamage()
。 調用getInventoryItem()
返回一個Item
,而不是一個Weapon
,因此父類對其子類的方法一無所知。 一種可能的解決方案是使用這里提到的自類型模式: 避免在繼承的 java 類中進行強制轉換
所以我自己一直在測試一些東西。 因為編譯器認為getInventoryItem()
將始終返回一個 Item,所以它不允許調用getDamage()
方法。 但是當getInventoryItem()
引用的對象是一個 Weapon 時,如果我簡單地添加int getDamage(){return -1}
作為 Item 類的方法,我仍然從 Weapon 中得到正確的int damage
值,而從還要別的嗎。 完美的!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.