[英]Avoiding instanceof Java
我试图找到一种方法来绕开instanceof的使用。 我创建了一个类Item,其中包含多个子类,例如WeaponItem和BodyItem。 现在,我想进行一个诸如equip(Item)的调用,它应该自行确定应该调用哪个重载函数,例如equip(BodyItem)。
在这种情况下,有没有一种方法可以绕开instanceof的使用,您会建议什么? 我听说在大多数情况下,使用instanceof是不好的做法,因此,我想知道替代方法是什么。
码:
inv.equip(it); // inv = inventory object, it = Item
库存类中的Equip函数示例,我希望如何使用它
public void equip(HelmItem it)
{
if (it != this.getHelm())
{
this.setHelm(it);
}
}
我以前怎么过的:
public void equip(Item it)
{
if (it instanceof WeaponItem)
{
if (it != this.getWeapon())
{
this.setWeapon((WeaponItem) it);
}
} etc for all subclasses of item
}
确实,这可以通过访客模式解决。
但是,它不一定是成熟的访客,而是它的简化版本。 您可以将库存传递给物料,然后让物料用它做任何想做的事情:
abstract class Item {
public abstract void equip(Inventory inv);
}
class HelmItem extends Item {
@Override
public void equip(Inventory inv) {
inv.setHelm(this);
}
}
class WeaponItem extends Item {
@Override
public void equip(Inventory inv) {
inv.setWeapon(this);
}
}
然后,您可以致电:
it.equip(inv)
没有instanceof
运算子。
为什么不将方法放在Item
具体类中,并且它可以自我装备? 这有点反常,但可以解决您的问题。
public class SomeConcreteItem extends Item {
public void equip(Body body) {
// Just an example.
body.getSections().get(0).equip(this);
}
}
这样,具体的实现就知道如何装备自己,而使用它的类则不在乎。 您可以通过Item
超类引用它,并提供Item
超类具有抽象方法的方法public void equip(Body body);
,那么您永远不需要了解具体的实现,因此也不需要instanceof
运算符。
设计模式介绍
您在引入设计模式时应该小心。 当确实可以使用更简单且(在我看来)更优雅的东西时,人们习惯直接跳到复杂的模式来解决问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.