2013-04-04 88 views
1

我在學校做遊戲。我有武器這是項目的一個子類。 而我在我的課堂上有一個名爲BattleGround的字段currentWeapon。我有一個方法來搜索和遍歷我的「揹包」中的所有項目。我希望也可以用這個武器,因爲它們也是物品。一個子類可以被稱爲它的超類的類型嗎?

我所希望的是,Weapon類的一個對象也可以稱爲一個項目。但我只是不知道。我是否需要一種新方法來遍歷WeaponWeapon s和Item s都要存放在同一個揹包裏。

如果我存儲領域currentWeaponWeapon,我不能使用的方法,也許不存儲Weapon S IN StringHashmap S和Item秒。如果我將它作爲Item存儲,則不能使用Weapon類的方法。謝謝。

+3

一個例子會讓我更容易理解我的猜測。 – Kai 2013-04-04 08:02:42

+0

是的,一個子類的定義之一是它可以在任何需要其超類的實例的地方使用。所以,就你的情況而言,如果'Weapon extends Item'和有接受Item的代碼,它也會接受一個'Weapon'。 – miorel 2013-04-04 08:04:04

+0

是的,我明白,但這是一個相當容易的問題,雖然不是嗎? 武器可以像物品一樣對待嗎?一個子類可以像超類的類型一樣對待嗎? 可以將子類武器的對象存儲在HashMap 中嗎? – 2013-04-04 08:06:18

回答

2

如果WeaponItem的子類,那麼您可以將Weapon存儲在Item對象集合中,沒有任何問題。也許,你需要學習的是instanceof操作:

List<Item> items = new ArrayList<>(); 

// add some items to the list 

for (Item item : items) { 
    if (item instanceof Weapon) { 
    Weapon weapon = (Weapon) item; // cast the item to a weapon 
    weapon.someWeaponMethod(); 
    } 
} 

如果使用instanceof,你可以決定你是否Item其實是一個Weapon

+2

在另一個注意事項上:'instanceOf'檢查不應該經常使用!有時會有解決方案可用,並使用'instanceOf'指示*設計氣味*。 – 2013-04-04 08:10:27

+0

@NarendraPathai我不認爲你可以做出這樣的全面陳述。就像任何程序化的習慣用法一樣,你必須看到上下文才能理解它是否是「正確的」選擇。 – 2013-04-04 08:11:18

+0

我認爲值得一提的是,你正在將物品投射到那裏的武器上。這使我們可以訪問'Weapon'中定義的方法和字段,而不僅僅是'Item'。 – 2013-04-04 08:11:22

相關問題