Movable, Attackable are kinds of possible behaviours of an object, so it's better for them to be interfaces.
As for implementation of those behaviours - to solve your problem of repeating code, you can have separate classes - let's name them services - for each behaviour, eg. MoveService, AttackService.
Then, you can either inject those services into the objects you're creating (eg. new Tank(myMoveService) ) or pass objects to those services, eg. MoveService.instance().move(myTank)
You can run some custom code for each class by calling a delegate method.
Example
interface Movable { public void onMove(); }
class Tank implements Movable {
public void onMove() {
//tank moved!
}
}
class MoveService {
public void move(Movable m) {
// do what you need to do to move
// invoke custom code by running a delegate method
m.onMove();
}
}