Когда использовать super или override в методах при расширении из класса? - PullRequest
0 голосов
/ 12 мая 2018

Привет, я новичок в java, и в настоящее время у меня есть два класса (useForce и Attack), которые работают нормально, но эти два класса имеют много общего кода. Чтобы уменьшить дублирующийся код, я расширил использование класса Force из класса Attack, но я я не уверен, как изменить код?

Например, в моем 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?

1 Ответ

0 голосов
/ 12 мая 2018

Шаблон шаблонного метода может помочь решить проблему дублирования.
Позволяет определить общий алгоритм в базовом классе, оставляя подклассы для настройки некоторых частей алгоритма.

Итак, определите как общие конкретные операции, так и пользовательские операции для определения подклассами в абстрактном классе: 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;
        }
    }


}

Сейчас Attack, а другие подклассы наследуются от 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;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...