java - 从类扩展时,何时在方法中使用 super 或 override?
问题描述
嗨,我是 java 新手,我目前有两个运行良好的类(useForce 和 Attack),但是这两个类共享很多代码。为了减少重复代码,我从 Attack 类扩展了使用 Force 类,但我不确定如何修改代码?
例如在我的 attack.java
public class Attack extends SWAffordance implements SWActionInterface {
some code here...
@Override
public boolean canDo(SWActor a) {
SWEntityInterface target = this.getTarget();
return !a.isDead() && target.getHitpoints()>0;
}
@Override
public void act(SWActor a) {
SWEntityInterface target = this.getTarget();
boolean targetIsActor = target instanceof SWActor;
SWActor targetActor = null;
int energyForAttackWithWeapon = 1;//the amount of energy required to attack with a weapon
if (targetIsActor) {
targetActor = (SWActor) target;
}
但是我的 useForce.java 中相同的两种方法是
public class UseForce extends Attack {
some code here....
@Override
public boolean canDo(SWActor a) {
return a.getForcepoints()>=minUsePoints;
}
@Override
public void act(SWActor a) {
SWEntityInterface target = this.getTarget();
boolean targetIsActor = target instanceof SWActor;
SWActor targetActor = null;
int energyForForceAttack = 2;//the amount of energy required to use force
if (targetIsActor) {
targetActor = (SWActor) target;
}
正如您所看到的,这两个在 act 方法中共享许多相似的代码行,除了 Attack.java int energyForAttackWithWeapon = 1 而在 useForce int energyforAttackWithWeapon=2... 我如何使用 super 或 override 来减少重复代码的行数?帮助将不胜感激。
编辑:如果我使用第三方类来提取重复的代码,我该怎么做,因为 Attack 已经从 SWAffordance 扩展?
解决方案
模板方法模式可以帮助解决您的重复问题。
它允许在基类中定义通用算法,同时让子类自定义算法的某些部分。
因此,定义通用的具体操作和自定义操作以由抽象类中的子类定义:AbstractAttack
。
public abstract class AbstractAttack extends SWAffordance implements SWActionInterface {
public abstract int getEnergyForAttack();
public abstract boolean canDo(SWActor a);
public void act(SWActor a) {
SWEntityInterface target = this.getTarget();
boolean targetIsActor = target instanceof SWActor;
SWActor targetActor = null;
int energyForAttack = getEnergyForAttack();
... // use energyForAttack
if (targetIsActor) {
targetActor = (SWActor) target;
}
}
}
NowAttack
和 Other 子类继承于AbstractAttack
从具体操作中受益并实现它们自己的特性:
public class DefaultAttack extends AbstractAttack {
@Override
public boolean canDo(SWActor a) {
SWEntityInterface target = this.getTarget();
return !a.isDead() && target.getHitpoints()>0;
}
@Override
public int getEnergyForAttack(){
return 1;
}
}
public class UseForce extends AbstractAttack {
@Override
public boolean canDo(SWActor a) {
return a.getForcepoints()>=minUsePoints;
}
@Override
public int getEnergyForAttack(){
return 2;
}
}