我试图开发一种构造算术和逻辑表达式的方法,并对它们执行操作。对于我正在使用复合模式的结构,以及我使用访问者模式的操作。
我对具体访客类的实施感到有些困惑。
以下是我目前的工作方式:
我的补充课程:
class
ADDITION
inherit
BINARY
create
make
feature -- ctor
make (left : EXPRESSION ; right : EXPRESSION)
do
left_expression := left
right_expression := right
end
feature -- deferred implementation
evaluate : INTEGER
do
Result := left_expression.evaluate + right_expression.evaluate
end
to_string : STRING
do
create Result.make_empty
end
accept (v : VISITOR)
do
v.visit_addition (Current)
end
end
现在对于访问者模式,这里是一个应该评估给定表达式的具体访问者(我还想要一个进行类型检查,漂亮打印等的具体访问者)。
class
EVALUATE_VISITOR
inherit
VISITOR
create
make
feature -- attribs
value : INTEGER
value_bool : BOOLEAN
feature -- ctor
make
do
end
feature
visit_addition (expression : ADDITION)
do
value := expression.left_expression.evaluate +
expression.right_expression.evaluate
end
end
我的问题是,在我的每个结构(ADDITION,SUBTRACTION,NEGATION等)中没有使用评估方法会破坏访问者模式的目的,因为所有的评估都应该在访问者类中进行?那么如何在访问者类中实现它呢?我以为我可以这样做:
visit_addition (expression : ADDITION)
do
value := expression.left_expression.accept(Current) +
expression.right_expression.accept(Current)
end
但是我必须在我的结构中有许多接受方法,对于算术表达式,它必须返回INTEGER,对于逻辑操作,它必须返回BOOLEAN。
答案 0 :(得分:2)
实际上,执行此操作的方法如下:
visit_addition (expression: ADDITION)
local
l_left_value, l_right_value: INTEGER
do
expression.left_expression.accept (Current)
l_left_value := last_value
expression.right_expression.accept (Current)
l_right_value := last_value
last_value := l_left_value + l_right_value
end
这是在访问者中计算INTEGER的添加项。 `last_value'属性在访问者类中定义。
要回答你的另一个问题,在ADDITION课程中你不需要`evaluate'。