Re[6]: Функциональное программирование в Nemerle
От: Аноним  
Дата: 14.05.07 21:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я обратил. Пока думаю, как реализовать это на 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());
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.