2015-08-04 6 views
0

Im пытается разработать способ построения арифметических и логических выражений и выполнять операции над ними. Для структуры я использую составной шаблон, и для операций я использую шаблон посетителя.Шаблон посетителя и составной шаблон

Я немного запутался в реализации конкретного класса посетителей.

Вот как я в настоящее время сделать это:

Мой Сложение класс:

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 

Мой вопрос, оленья кожа, имеющий метод оценки в каждом из моих структур (сложение, вычитание, ОТРИЦАНИЯ и т.д.) поражение цели картины посетителей, так как все оценки должны быть сделаны в классе посетителя ? Как это реализовать в классе посетителей? Я думал, что я мог бы сделать что-то вроде:

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

, но тогда я должен был бы иметь многие принимают методы в своих структурах, для арифметических выражений придется возвращать INTEGER, и для логических операций, она должна была бы вернуться BOOLEAN ,

ответ

2

На самом деле способ сделать это было бы следующее:

Это в посетителе, который вычисляет дополнения для INTEGER. Атрибут `last_value 'определяется в вашем классе посетителя.

Чтобы ответить на другой вопрос, в классе ADDITION вам не нужно «оценивать».

 Смежные вопросы

  • Нет связанных вопросов^_^