首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问者模式与复合模式

访问者模式与复合模式
EN

Stack Overflow用户
提问于 2015-08-04 07:57:05
回答 1查看 443关注 0票数 0

我试图开发一种方法来构造一个算术和逻辑表达式,并对它们执行操作。对于结构,我使用复合模式,对于操作,我使用访问者模式。

对于具体访问者类的实现,我有点困惑。

我现在是这样做的:

我的加班:

代码语言:javascript
复制
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

现在,对于访问者模式,这里有一个具体的访问者,它应该评估给定的表达式(我还想要一个具体的访问者来进行类型检查、漂亮的打印等等)。

代码语言:javascript
复制
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

我的问题是,我的每一个结构(加法、减法、否定等)都没有评估方法。放弃访问者模式的目的,因为所有的评估都应该在访问者类中进行?那么我如何在访问者类中实现它呢?我在想我可以做这样的事:

代码语言:javascript
复制
visit_addition (expression : ADDITION)
    do
        value := expression.left_expression.accept(Current) +
                    expression.right_expression.accept(Current)
    end

但是,我的结构中必须有许多接受方法,对于算术表达式,它必须返回整数,对于逻辑操作,必须返回布尔值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-04 16:43:26

实际上,这样做的方法如下:

代码语言:javascript
复制
    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

这是在计算整数加法的访问者中。`last_value属性是在访问者类中定义的。

要回答你的另一个问题,在加法类中你不需要‘评估’。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31803703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档