私は最近、Java継承の仕組みの階層設計を研究しています。しかし、私はどの点から始めなければならないのか分かりません。Java - クラス階層を決定するには?
2進表現を計算する例では、2つのクラスLiteral
とBinary
を使用する必要があります。しかし、それは次のサンプル出力を与えることを示唆している:
Literal a = new Literal(6);
Literal b = new Literal(12);
System.out.println(b); //Prints out: 12.0
System.out.println(b.evaluate()); //Prints out: 12.0
Binary e = new Binary(b, a, Operation.DIVIDE);
System.out.println(e); //Prints out: 12.0/6.0
Binary f = new Binary(e, a, Operation.PLUS);
System.out.println(f); //Prints out: (12.0/6.0) + 6.0
System.out.println(f.evaluate()); //Prints out: 8.0
Binary g = new Binary(e, f, Operation.TIMES);
System.out.println(g.evaluate()); //Prints out: 16.0
* Operation
は、列挙型は、私がLiteral
のクラスと別のクラスBinary
を設計しようとした4つの事業PLUS、MINUS、TIMESおよびDIVIDE
を定義していますこれは...クラスLiteral
から延びている...しかし、私はそれが出力の次のフォローアップのための要件間違った何かを持っている可能性があることが判明:
Variable v = new Variable(“a“);
Expression n = new Binary(f, v, Operation.DIVIDE);
System.out.println(n); //Prints out: ((12.0/6.0) + 6.0)/a
Environment x = new Environment();
x.addVariable(“a“, 4.0); //Variable “a“ has a value 4.0 in x
System.out.println(n.evaluate()); //RuntimeException
System.out.println(n.evaluate(x)); //Prints out: 2.0 (8.0/4.0 = 2.0)
私がことがわかりましたクラスBinary
は、要件を満たすためにExpression
から延長する必要があります...実際に私のデザインのために最初は間違っていますか?
なぜ 'Binary'は' Literal'を拡張しますか?私は両方の '式 'を実装することを期待します。 –
式構文解析は、コンポジットデザインパターンを適用するのに最適です:https://sourcemaking.com/design_patterns/composite – aquila
@JornVernee変数 'f'が型' Literal'のオブジェクトで定義されているため...申し訳ありません...私はコンセプトを誤解するかもしれません... – null