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 混乱。有些人觉得使用重载会使事情变得更难理解,并且容易出错。我个人不太喜欢超载。
所以我有一个 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 混乱。有些人觉得使用重载会使事情变得更难理解,并且容易出错。我个人不太喜欢超载。