算術式と論理式を構築し、それらに対して操作を実行する方法を開発しようとしています。構造にはコンポジット パターンを使用し、操作にはビジター パターンを使用しています。
具体的なビジター クラスの実装について少し混乱しています。
これが私が現在行っている方法です:
私の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 を返す必要があります。