我正在尝试编写基本的《星球大战》游戏。目前,我有一堂课:
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
。