首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >避免Java实例

避免Java实例
EN

Stack Overflow用户
提问于 2015-06-20 11:45:38
回答 2查看 424关注 0票数 0

我正试图找到一种方法来绕过instanceof。我已经创建了一个类项,它有多个子类,如WeaponItem和BodyItem。现在,我想做一个调用,如装备(项目),它应该自行确定应该调用的重载函数,如装备(BodyItem)。

在这种情况下,是否有一种方法可以绕过instanceof的使用,您有什么建议?我听说,在大多数情况下,使用instanceof是不好的做法,因此我想知道替代方案是什么。

代码:

代码语言:javascript
运行
复制
inv.equip(it); // inv = inventory object, it = Item

库存类中的设备功能示例--我最好是这样做的

代码语言:javascript
运行
复制
public void equip(HelmItem it) 
{
    if (it != this.getHelm())
    {
        this.setHelm(it);
    }
}

我以前是怎么做到的:

代码语言:javascript
运行
复制
public void equip(Item it)
{
    if (it instanceof WeaponItem)
    {
        if (it != this.getWeapon())
        {
            this.setWeapon((WeaponItem) it);
        } 
    } etc for all subclasses of item
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-20 12:24:24

事实上,这可以通过访客模式来解决。

然而,它不一定是一个全面的游客,而是一个简化的变化。您可以将库存传递给该项目,并让该项目做它想做的任何事情:

代码语言:javascript
运行
复制
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);
    }
}

然后你就可以打电话:

代码语言:javascript
运行
复制
it.equip(inv)

没有instanceof操作符。

票数 4
EN

Stack Overflow用户

发布于 2015-06-20 12:03:12

为什么不把这个方法放在Item的混凝土类中,它就可以装备自己了?这有点违背直觉,但它可以解决你的问题。

代码语言:javascript
运行
复制
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操作符。

--介绍一种设计模式的注记

您应该小心地介绍设计模式。人们有一个坏习惯,跳到一个复杂的模式来解决一个问题,当真正的更简单和(在我看来)更优雅是可用的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30953608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档