Здравствуйте, Аноним, Вы писали:
А>Я обратил. Пока думаю, как реализовать это на C#.
Достаточно перенести код для ToString и Eval в методы класса, тем самым если появится новый класс — то эти методы придется реализовать
using System;
abstract class Expression
{
public abstract double Eval();
public override abstract string ToString();
}
class Literal: Expression
{
private double value;
public double Value { get { return value; } }
public Literal(double value) { this.value = value; }
public override double Eval() { return value; }
public override string ToString() { return value.ToString(); }
}
abstract class Operation: Expression
{
private Expression first, second;
public Expression First { get {return first; } }
public Expression Second { get {return second; } }
public Operation(Expression first, Expression second)
{
this.first = first;
this.second = second;
}
}
class Min: Operation
{
public Min (Expression first, Expression second): base(first, second) {}
public override double Eval() { return Math.Min(First.Eval(), Second.Eval()); }
public override string ToString() { return "Min(" + First.ToString() + ", " + Second.ToString() + ")"; }
}
class Max: Operation
{
public Max(Expression first, Expression second): base(first, second) {}
public override double Eval() { return Math.Max(First.Eval(), Second.Eval()); }
public override string ToString() { return "Max(" + First.ToString() + ", " + Second.ToString() + ")"; }
}
class Plus: Operation
{
public Plus(Expression first, Expression second): base(first, second) {}
public override double Eval() { return First.Eval() + Second.Eval(); }
public override string ToString() { return First.ToString() + " + " + Second.ToString(); }
}
class Minus: Operation
{
public Minus(Expression first, Expression second): base(first, second) {}
public override double Eval() { return First.Eval() - Second.Eval(); }
public override string ToString() { return First.ToString() + " - " + Second.ToString(); }
}
class Mul: Operation
{
public Mul(Expression first, Expression second): base(first, second) {}
public override double Eval() { return First.Eval() * Second.Eval(); }
public override string ToString() { return First.ToString() + " * " + Second.ToString(); }
}
class Div: Operation
{
public Div (Expression first, Expression second): base(first, second) {}
public override double Eval() { return First.Eval() / Second.Eval(); }
public override string ToString() { return First.ToString() + " / " + Second.ToString(); }
}
public class Program
{
public static void Main(string[] arguments)
{
Expression expression = new Plus(new Literal(1.23), new Min(new Literal(3.45), new Literal(1.23)));
Console.WriteLine("Expression '{0}' = {1}", expression.ToString(), expression.Eval());
}
}