2016-11-20 4 views
-1

私は最近、Java継承の仕組みの階層設計を研究しています。しかし、私はどの点から始めなければならないのか分かりません。Java - クラス階層を決定するには?

2進表現を計算する例では、2つのクラスLiteralBinaryを使用する必要があります。しかし、それは次のサンプル出力を与えることを示唆している:

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から延長する必要があります...実際に私のデザインのために最初は間違っていますか?

+0

なぜ 'Binary'は' Literal'を拡張しますか?私は両方の '式 'を実装することを期待します。 –

+0

式構文解析は、コンポジットデザインパターンを適用するのに最適です:https://sourcemaking.com/design_patterns/composite – aquila

+0

@JornVernee変数 'f'が型' Literal'のオブジェクトで定義されているため...申し訳ありません...私はコンセプトを誤解するかもしれません... – null

答えて

1

クラスBのオブジェクトをとして記述することができる場合は、Aであることを考慮する必要があります。次にクラスBはクラスBを拡張する必要があります。 を表現した方がよいよう

一方のクラス間の直接の継承は、いくつかの厄介な問題を引き起こす可能性がありますインタフェースとクラスBImpl委譲継承された通話クラスAのproperyを持っ経由関係「です」あなたの最後のコメントから

interface A{ 
    void someMethod(); 
} 
interface B extends A{ 
    void someOtherMethod(); 
} 

class C implements A { 
    void someMethod(){} 
} 

class D implements B { 
    private A a; 
    D(A a){ 
    this.a=a; 
    } 

    void someMethod(){ 
    a.someMethod() 
    } 

    void someOtherMethod(){} 
} 
0

問題が明らかになった:へ

しかしとして定義された変数fBinary、両方LiteralBinaryExpressionを拡張する場合、コンストラクタの内部がLiteral又はBinary

のタイプを有していてもよく、その後、コンストラクタは両方LiteralBinaryが許容されている意味し、2つのExpressionパラメータを取ることができる:

interface Expression {...} 
class Literal implements Expression {...} 

class Binary implements Expression { 

    ... 
    public Binary(Expression lhs, Expression rhs, Operation op) { 
     ... 
    } 
    ... 
} 
+0

ありがとうございました。フォローアップの要件について私が考えていることです。しかし、最初の段階(上のブロック)には2つのクラス(バイナリとリテラル)しかありません。クラスの式は2つの部分に分割されるので、2番目の段階(下のブロック)です。 – null

+0

@nullしかし、誰もあなたがもっと...右にできないと言った人はいませんか? –