我正在尝试编写基本的《星球大战》游戏。目前,我有一堂课:

public class LightSaber extends SWEntity {

    public LightSaber(MessageRenderer m) {
        super(m);
        this.shortDescription = "A Lightsaber";
        this.longDescription = "A lightsaber.  Bzzz-whoosh!";
        this.hitpoints = 100000; // start with a nice powerful, sharp axe
        this.addAffordance(new Take(this, m));//add the take affordance so that the LightSaber can be taken by SWActors
    }

    public void canWield(SWActor actor) {
        if (actor.getForcepoints() >= minForcePoints) {
            this.capabilities.add(Capability.WEAPON);// it's a weapon.
        }
    }

}


如果演员有足够的力量,基本上lightsaber就是武器,但是当我实例化lightsaber类时如下所示:

LightSaber bensweapon = new LightSaber(m);
setItemCarried(bensweapon);


显然,不会调用canWield方法。每次实例化类时如何调用该方法?我应该创建一个接口canWield并实现它吗?



编辑:好的,这是我的setItemCarried()代码:

public void setItemCarried(SWEntityInterface target) {
    this.itemCarried = target;
}

最佳答案

显然,某些SWEntityInterface无法使用某些LightSaber(即SWActor)对象。而且我猜您想先检查this是否可以使用SWEntityInterface,然后再将其设置为携带的物品。

您应该将方法canWield(SWActor)添加到SWEntityInterface,并有选择地提供返回true的默认实现。

interface SWEntityInterface {
    boolean canWield(SWActor actor);
}


现在,您在setItemCarried中称呼它:

public void setItemCarried(SWEntityInterface target) {
    if (target.canWield(this)) {
        this.itemCarried = target;
    }
}


请注意,我们没有更改初始化LightSaber时会发生的情况,因为创建LightSaber的实例是完全可以的。您要在此处控制的是设置SWActor不能作为其itemCarried携带的内容。

另外,请考虑将canWield重命名为canBeWieldedBy

10-01 12:10