簡體   English   中英

從父類型子類對象Java訪問子類實例方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM