我正试图找到一种方法来绕过instanceof。我已经创建了一个类项,它有多个子类,如WeaponItem和BodyItem。现在,我想做一个调用,如装备(项目),它应该自行确定应该调用的重载函数,如装备(BodyItem)。
在这种情况下,是否有一种方法可以绕过instanceof的使用,您有什么建议?我听说,在大多数情况下,使用instanceof是不好的做法,因此我想知道替代方案是什么。
代码:
inv.equip(it); // inv = inventory object, it = Item库存类中的设备功能示例--我最好是这样做的
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
}发布于 2015-06-20 12:24:24
事实上,这可以通过访客模式来解决。
然而,它不一定是一个全面的游客,而是一个简化的变化。您可以将库存传递给该项目,并让该项目做它想做的任何事情:
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操作符。
发布于 2015-06-20 12:03:12
为什么不把这个方法放在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操作符。
--介绍一种设计模式的注记
您应该小心地介绍设计模式。人们有一个坏习惯,跳到一个复杂的模式来解决一个问题,当真正的更简单和(在我看来)更优雅是可用的。
https://stackoverflow.com/questions/30953608
复制相似问题