Java - 同一 class 结构的多个访问者模式

Java - Multiple visitor patterns for the same class structure

所以我有一个 class 表达式结构,由二进制表达式、一元表达式组成,所有这些都是抽象的,它们扩展到它们特定的具体 class 操作中,例如 Add、Sub、 Mul, Not, 等等... 像这样。

我想为每个 class 创建 2 个访问者。一个用于 toString,一个用于计算表达式(计算值)。

问题是,我的 toStringVisitor 应该总是 return 一个字符串,但是 evaluateVisitor 将 return 变量类型取决于操作(即:Add 将 return 一个 int,Lower than 或 Not 将 return 一个布尔值,其他一些将 return 其他类型)

我可以避免为这 2 个访问者创建 2 个访问者界面吗?

比如我现在拥有的

public interface Visitor {

Public int visit(Neg c);
Public int visit(Add c);
Public int visit(Sub c);
Public int visit(Mul c);
Public boolean visit(Lowerthan c);
Public boolean visit(Greaterthan c);
Public boolean visit(Equal c);
Public boolean visit(Not c);
Public boolean visit(And c);
Public boolean visit(Or c);

}

仅适用于 evaluateVisitor,不适用于 toString 访问者。

另外,使用example有什么区别:

Public int visit(Neg c);
Public int visit(Add c);
Public int visit(Sub c);
Public int visit(Mul c);

Public int visitNeg(Neg c);
Public int visitAdd(Add c);
Public int visitSub(Sub c);
Public int visitMul(Mul c);

有人告诉我应该区分访问方法以避免动态绑定问题,但我真的不明白为什么会这样。

您可以使访问者通用:

interface Visitor<R> {
    R visit(Neg c);
    ...
}

因此您的 ToStringVisitor 将实现 Visitor<String>,另外两个将实现 Visitor<Integer>Visitor<Boolean>

关于使用 visit() 还是 visitNeg(),这是一个选择问题。有些人认为使用不同的名称会使 API 混乱。有些人觉得使用重载会使事情变得更难理解,并且容易出错。我个人不太喜欢超载。