Допустим, у нас есть следующая иерархия данных в C # для оценки математических (префиксных) выражений в int
арифметике:
abstract class Expression {
public abstract int Evaluate();
}
class ValueExpression : Expression {
public int Value {
get;
}
public sealed override int Evaluate() {
return Value;
}
}
abstract class OperatorExpression : Expression {
// ...
}
abstract class BinaryExpression : OperatorExpression {
protected Expression op0, op1;
public Expression Op0 {
get { return op0; }
set { op0 = value; }
}
public Expression Op1 {
get { return op1; }
set { op1 = value; }
}
public sealed override int Evaluate() {
return Evaluate(op0.Evaluate(), op1.Evaluate());
}
protected abstract int Evaluate(int op0Value, int op1Value);
}
sealed class PlusExpression : BinaryExpression {
protected override int Evaluate(int op0Value, int op1Value) {
return checked(op0Value + op1Value);
}
} // and more operators...
Как я могу использовать шаблон посетителя для оценки выражения и выписатьрезультат как int
или double
на основе ввода пользователя?Я подумал, что мог бы написать класс Visitor, который содержит double result;
, и каждый Visit(...)
будет оценивать (под) выражение, используя double
арифметику, а затем я преобразую результат в int
, если это необходимо.Но является ли это лучшим решением для этого с помощью шаблона посетителя?Что если я захочу использовать long
позже?Надо было бы модифицировать классы нетривиальным количеством кода, или?(Примечание: я хотел бы использовать шаблон посетителя (а не динамический), а не какой-либо общий код.)