Основы объектно-ориентированного программирования на языке C# book | Page 187

8.5 Комплексна вправа до роздiлу 7 if (!input.IsEmpty() && input.Current == Symbol) { input.MoveNext(); return true; } else return false; } } public sealed class UnaryOp : Operation { private readonly char symbol; private readonly Func f; public UnaryOp(char symbol, Func f) { this.symbol = symbol; this.f = f; } public override char Symbol { get { return symbol; } } public override long Eval(params long[] args) { if (args.Length != 1) throw new ArgumentException("Invalid number of arguments of an unary operation"); return f(args[0]); } } public sealed class BinaryOp : Operation { private readonly int priority; private readonly char symbol; private readonly Func f; public int Priority { get { return priority; } } public override char Symbol { get { return symbol; } } public BinaryOp(int priority, char symbol, Func f) { if (priority <= 0) throw new ArgumentException("Priority must be > 0"); this.priority = priority; this.symbol = symbol; this.f = f; } public override long Eval(params long[] args) { if (args.Length != 2) throw new ArgumentException("Invalid number of arguments of a binary operation"); return f(args[0], args[1]); } } 187