Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | |
| 2 // for details. All rights reserved. Use of this source code is governed by a | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 import "package:expect/expect.dart"; | |
| 6 | |
| 7 // library abstract_expressions; | |
| 8 | |
| 9 abstract class AbstractExpression {} | |
| 10 | |
| 11 abstract class AbstractAddition<E> { | |
| 12 E operand1, operand2; | |
| 13 AbstractAddition(this.operand1, this.operand2); | |
| 14 } | |
| 15 | |
| 16 abstract class AbstractSubtraction<E> { | |
| 17 E operand1, operand2; | |
| 18 AbstractSubtraction(this.operand1, this.operand2); | |
| 19 } | |
| 20 | |
| 21 abstract class AbstractNumber { | |
| 22 int val; | |
| 23 AbstractNumber(this.val); | |
| 24 } | |
| 25 | |
| 26 // library evaluator; | |
| 27 | |
| 28 abstract class ExpressionWithEval { | |
| 29 int get eval; | |
| 30 } | |
| 31 | |
| 32 abstract class AdditionWithEval<E extends ExpressionWithEval> { | |
| 33 E get operand1; | |
| 34 E get operand2; | |
| 35 int get eval => operand1.eval + operand2.eval; | |
| 36 } | |
| 37 | |
| 38 abstract class SubtractionWithEval<E extends ExpressionWithEval>{ | |
| 39 E get operand1; | |
| 40 E get operand2; | |
| 41 int get eval => operand1.eval - operand2.eval; | |
| 42 } | |
| 43 | |
| 44 abstract class NumberWithEval { | |
| 45 get val; | |
|
gbracha
2014/01/14 01:39:33
int get val to be consistently typed.
regis
2014/01/14 18:40:45
Done.
| |
| 46 int get eval => val; | |
| 47 } | |
| 48 | |
| 49 // library multiplication; | |
| 50 | |
| 51 abstract class AbstractMultiplication<E> { | |
| 52 E operand1, operand2; | |
| 53 AbstractMultiplication(this.operand1, this.operand2); | |
| 54 | |
| 55 } | |
| 56 | |
| 57 // library multiplicationEvaluator; | |
| 58 | |
| 59 // import 'evaluator.dart' show ExpressionWithEval; | |
| 60 | |
| 61 abstract class MultiplicationWithEval<E extends ExpressionWithEval> { | |
| 62 E get operand1; | |
| 63 E get operand2; | |
| 64 int get eval => operand1.eval * operand2.eval; | |
| 65 } | |
| 66 | |
| 67 // library string_converter; | |
| 68 | |
| 69 abstract class ExpressionWithStringConversion { | |
| 70 String toString(); | |
| 71 } | |
| 72 | |
| 73 abstract class AdditionWithStringConversion<E extends ExpressionWithStringConver sion> { | |
| 74 E get operand1; | |
| 75 E get operand2; | |
| 76 String toString() =>'($operand1 + $operand2))'; | |
| 77 } | |
| 78 | |
| 79 abstract class SubtractionWithStringConversion<E extends ExpressionWithStringCon version> { | |
| 80 E get operand1; | |
| 81 E get operand2; | |
| 82 String toString() => '($operand1 - $operand2)'; | |
| 83 } | |
| 84 | |
| 85 abstract class NumberWithStringConversion { | |
| 86 int get val; | |
| 87 String toString() => val.toString(); | |
| 88 } | |
| 89 | |
| 90 abstract class MultiplicationWithStringConversion<E extends ExpressionWithString Conversion> { | |
| 91 E get operand1; | |
| 92 E get operand2; | |
| 93 String toString() => '($operand1 * $operand2)'; | |
| 94 } | |
| 95 | |
| 96 // library expressions; | |
| 97 | |
| 98 // import 'abstractExpressions.dart'; | |
| 99 // import 'evaluator.dart'; | |
| 100 // import 'multiplication.dart'; | |
| 101 // import 'multiplicationEvaluator.dart'; | |
| 102 // import 'stringConverter.dart'; | |
| 103 | |
| 104 class Expression = | |
| 105 AbstractExpression with ExpressionWithEval, ExpressionWithStringConversion; | |
| 106 | |
| 107 class Addition = | |
| 108 AbstractAddition<Expression> with AdditionWithEval<Expression>, | |
| 109 AdditionWithStringConversion<Expression> imp lements Expression; | |
| 110 | |
| 111 class Subtraction = | |
| 112 AbstractSubtraction<Expression> with SubtractionWithEval<Expression>, | |
| 113 SubtractionWithStringConversion<Expressio n> implements Expression; | |
| 114 | |
| 115 class Number = | |
| 116 AbstractNumber with NumberWithEval, | |
| 117 NumberWithStringConversion implements Expression; | |
| 118 | |
| 119 | |
| 120 class Multiplication = | |
| 121 AbstractMultiplication<Expression> with MultiplicationWithEval<Expression>, | |
| 122 MultiplicationWithStringConversion<Exp ression> implements Expression; | |
| 123 | |
| 124 | |
| 125 void main() { | |
| 126 Expression e = new Multiplication(new Addition(new Number(4), new Number(2)), | |
| 127 new Subtraction(new Number(10), new Number(7 ))); | |
| 128 Expect.equals('((4 + 2)) * (10 - 7)) = 18', '$e = ${e.eval}'); | |
| 129 } | |
| OLD | NEW |