2013-04-04 91 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

相关问题