首页 > 解决方案 > 如何为抽象类或接口的子类型实现访问者模式?

问题描述

我有这个特定的问题,我无法用其他问题解决。我正在尝试为游戏实现一个访问者,访问者是一个Attack类,它必须在矩阵中搜索可能包含的单元格Characters,然后如果角色是敌人而不是朋友,则损坏它。

我遇到的问题是不使用 anInstanceOf来访问角色,因为它违反了开闭原则。这是我的代码:

访客界面

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 类中做些什么来访问 Character 的 Friend 或 Foe 子类而不破坏使用 InstanceOf 的设计?

编辑澄清:朋友和敌人是角色的子类。

标签: javaoopdesign-patternssolid-principlesvisitor-pattern

解决方案


几个小时后我解决了。这个问题不是由访问者模式的错误实现引起的,而是因为调用了超类Character,就像java.lang.Character. 在编写 java 游戏时要小心不要覆盖这个类。


推荐阅读