У меня возникла эта конкретная проблема, с которой я не мог разобраться с другими вопросами. Я пытаюсь реализовать посетителя для игры, посетитель - это класс Attack
, и он должен искать в матрице ячейки, которые могут содержать Characters
, затем, если персонаж враг, а не друг, повредить его.
У меня возникли проблемы с тем, чтобы не использовать InstanceOf
для посещения персонажа, так как это нарушает принцип открытого-закрытого. Вот мой код:
Интерфейс для посетителей
public interface Visitor {
public void visit(GroundCell c);
public void visit(MountainCell c);
public void visit(BuildingCell c);
public void visit(WaterCell c);
public void visit(Foe f);
public void visit(Friend f);}
Атака на абстрактный класс
public abstract class Attack implements Visitor {
}
Атака на конкретный класс
public class TankAttack extends Attack{
...
@Override
public void visit(GroundCell c) {
//here, i'd like to call c.getCharacter.accept(this)
}
Но я получаю сообщение об ошибке Я должен сначала реализовать Visit(Character c), когда он нужен только для его подклассов.
Что я должен сделать в классе TankAttack, чтобы посетить подклассы Friend или Foe Character и не сломать дизайн с помощью InstanceOf?
Изменить для уточнения: друг и враг являются подклассами персонажа.