所以我有一个由二进制表达式,一元表达式组成的表达式的类结构,所有这些都是抽象的,这些扩展到它们具体的具体操作类,如Add,Sub,Mul,Not等......就像这样。
我想为每个类创建2个访问者。一个用于toString,另一个用于评估表达式(计算值)。
问题是,我的toStringVisitor应该总是返回一个String,但evaluateVisitor将根据操作返回变量类型(即:Add将返回一个int,Lower than或Not将返回一个boolean,其他一些将返回其他类型以及)
我可以避免为这两位访问者创建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访客。
另外,使用例如:
之间有什么区别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);
我被告知我应该区分访问方法以避免动态绑定问题,但我无法弄清楚为什么会出现这种情况。
答案 0 :(得分:4)
您可以将访客设为通用:
interface Visitor<R> {
R visit(Neg c);
...
}
因此,您的ToStringVisitor将实施Visitor<String>
,其他两个将实施Visitor<Integer>
和Visitor<Boolean>
。
关于使用visit()和visitNeg(),这是一个选择问题。有些人认为使用不同的名称会使API混乱。有些人觉得使用重载会使事情变得更复杂,容易出错。我个人不是超载的忠实粉丝。