gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:50:46 26 4
gpt4 key购买 nike

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

Class Structure

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

问题是,我的 toStringVisitor 应该总是返回一个 String,但是 evaluateVisitor 将根据操作返回变量类型(即:Add 将返回一个 int,Lower than 或 Not 将返回一个 boolean,其他一些将返回其他类型还有)

我可以避免为这 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 访问者。

此外,使用例如有什么区别:

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);

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

最佳答案

您可以使访问者通用:

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

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

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

关于Java - 同一类结构的多个访问者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41027586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com