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