Обобщить наследуемые классы в абстрактном JAVA
Нужно обобщить два класса. Есть абстрактный класс:
public abstract class AbstractRobot extends UpdatableUnit {
// --------------------------- Перемещение ------------------------------------
public abstract boolean canMoveTo(Cell to);
public abstract void move(Direction direct);
}
А также два наследующих класса:
public class StrongRobot extends AbstractRobot {
// --------------------------- Перемещение ------------------------------------
@Override
public boolean canMoveTo(Cell to) {return true;}
@Override
public void move(Direction direct) {
// Сделать вытаскивание предмета из ячейки, если ячейка не пустая, и переход в нее
Cell pos = typedOwner();
Cell newPos = pos.neighbor(direct);
if(newPos == null) {
return;
}
if(!canMoveTo(newPos)) {
newPos.extractUnit();
}
pos.extractUnit();
newPos.putUnit(this);
fireStateChanged();
}
// -----------------------------------------------------------------
@Override
public String toString() {
String msg;
msg = "R(∞)";
return msg;
}
}
И, соответственно:
public class SimpleRobot extends AbstractRobot {
// ------------------------------- Заряд ---------------------------------
private int _charge = 25;
private static final int REQUIRED_CHARGE_FOR_MOVE = 1;
public int charge() {
return _charge;
}
public boolean isAvailableCharge(int chargeQuery) {
return chargeQuery <= _charge;
}
protected int reduceCharge(int chargeQuery) {
int retrievedCharge = Math.min(_charge, chargeQuery);
_charge -= retrievedCharge;
return retrievedCharge;
}
// --------------------------- Перемещение ------------------------------------
@Override
public boolean canMoveTo(Cell to) {
return to.isEmpty();
}
@Override
public void move(Direction direct) {
Cell pos = typedOwner();
if(!isAvailableCharge(REQUIRED_CHARGE_FOR_MOVE)) {
return;
}
Cell newPos = pos.neighbor(direct);
if(newPos == null) {
return;
}
if(!canMoveTo(newPos)) {
return;
}
pos.extractUnit();
newPos.putUnit(this);
reduceCharge(REQUIRED_CHARGE_FOR_MOVE);
fireStateChanged();
}
// -----------------------------------------------------------------
@Override
public String toString() {
String msg;
msg = "R(" + charge() + ")";
return msg;
}
}
Как вы могли заметить, перемещение в этих двух классах совпадает на 80%. Цель - обобщить классы, то есть вынести в абстрактный класс перемещение.