首页 > 解决方案 > 从类扩展时,何时在方法中使用 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 扩展?

标签: javainheritance

解决方案


模板方法模式可以帮助解决您的重复问题。
它允许在基类中定义通用算法,同时让子类自定义算法的某些部分。

因此,定义通用的具体操作和自定义操作以由抽象类中的子类定义: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;
   }
}

推荐阅读