0

算術式と論理式を構築し、それらに対して操作を実行する方法を開発しようとしています。構造にはコンポジット パターンを使用し、操作にはビジター パターンを使用しています。

具体的なビジター クラスの実装について少し混乱しています。

これが私が現在行っている方法です:

私のADDITIONクラス:

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 など) のそれぞれに evaluate メソッドが含まれていると、ビジター パターンの目的が無効になるのではないかということです。それをビジタークラスに実装するにはどうすればよいですか?私は次のようなことができると思っていました:

visit_addition (expression : ADDITION)
    do
        value := expression.left_expression.accept(Current) +
                    expression.right_expression.accept(Current)
    end

しかし、その後、構造体に多くの受け入れメソッドが必要になり、算術式の場合は INTEGER を返す必要があり、論理演算の場合は BOOLEAN を返す必要があります。

4

1 に答える 1

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 クラスでは「評価」は必要ありません。

于 2015-08-04T16:43:26.300 に答える