Java 基于实例类型的解释器调用方法的访问者模式

Java 基于实例类型的解释器调用方法的访问者模式,java,Java,由于类型不兼容,下面的代码无法编译。然而,我正在尝试做类似的事情。据我所知,为了让它正常工作,我必须使用超类并检查它是什么类型,然后使用开关盒或讨厌的if-else设置。我可以在这里利用多态性,将visit方法放在ASTNode中,并在每个子类中重写它,但是,当我想确保它保留在解释器类中时,这就是将逻辑放在ASTNode类中 public class Test { private class ASTNode{ } private class ExprNode exte

由于类型不兼容,下面的代码无法编译。然而,我正在尝试做类似的事情。据我所知,为了让它正常工作,我必须使用超类并检查它是什么类型,然后使用开关盒或讨厌的if-else设置。我可以在这里利用多态性,将visit方法放在ASTNode中,并在每个子类中重写它,但是,当我想确保它保留在解释器类中时,这就是将逻辑放在ASTNode类中

public class Test {

    private class ASTNode{

    }
    private class ExprNode extends ASTNode{

    }
    private class VarNode extends ASTNode{

    }
    private class Interpreter{

        public Interpreter(ASTNode node){
            this.visit(node);
        }

        public void visit(ExprNode node){

        }
        public void visit(VarNode node){

        }

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        ASTNode node = new ExprNode();
        Interpreter interpreter =  new Interpreter(node);
    }
}
我正在构建一个解释器,我正在为解释器使用访问者模式。每种类型的节点都有一种访问方法。在我使用python编写的示例中,它们使用getattr方法,根据子类将调用分派到正确的方法。我不知道Java中有任何类似的东西

最后,如果我在这里使用多态性,我将在ASTNode类中为解释器和Symantic Analyzer定义不同的访问方法。我喜欢在解释器类中包含解释器逻辑的想法,但我不喜欢基于子类类型的大型开关


有什么想法吗?也许我错过了一个简单的技巧。

访问者模式的要点是通过处理单个子类上的访问者调用,用多态性替换“巨大的开关”。这并不意味着逻辑包含在子类中,而是在visitor类上定义的。下面是您的示例中的情况:

interface NodeVisitor {
    void visit(ExprNode node);
    void visit(VarNode node);
}

class Interpreter implements NodeVisitor {
    @Override
    public void visit(ExprNode node) {
        // custom logic here
    }

    @Override
    public void visit(VarNode node) {
        // custom logic here
    }
}

private class ASTNode {
    public abstract void accept(NodeVisitor visitor);
}

private class ExprNode extends ASTNode {
    @Override
    public void accept(NodeVisitor visitor) {
        visitor.visit(this);
    }
}

private class VarNode extends ASTNode {
    @Override
    public void accept(NodeVisitor visitor) {
        visitor.visit(this);
    }
}

public static void main(String[] args) {
    ASTNode node = new ExprNode();
    node.accept(new Interpreter());
}

访问者模式的要点是通过处理单个子类上的访问者调用,用多态性替换“巨大开关”。这并不意味着逻辑包含在子类中,而是在visitor类上定义的。下面是您的示例中的情况:

interface NodeVisitor {
    void visit(ExprNode node);
    void visit(VarNode node);
}

class Interpreter implements NodeVisitor {
    @Override
    public void visit(ExprNode node) {
        // custom logic here
    }

    @Override
    public void visit(VarNode node) {
        // custom logic here
    }
}

private class ASTNode {
    public abstract void accept(NodeVisitor visitor);
}

private class ExprNode extends ASTNode {
    @Override
    public void accept(NodeVisitor visitor) {
        visitor.visit(this);
    }
}

private class VarNode extends ASTNode {
    @Override
    public void accept(NodeVisitor visitor) {
        visitor.visit(this);
    }
}

public static void main(String[] args) {
    ASTNode node = new ExprNode();
    node.accept(new Interpreter());
}

visit
方法能否不在
节点
类上?
visit
方法能否不在
节点
类上?完美的解释!!非常感谢!完美的解释!!非常感谢!