8

私はこの問題の変種に戻ってきます。おそらく非常に単純な解決策がありますが、それを理解できないようです...

クラス DimensionQuantity を拡張する、DistanceQuantity、AreaQuantity などの xQuantity 形式のクラスがたくさんあります。これで、DistanceQuantity や AreaQuantity などを加算または減算できますが、それらを混合することはできないため、サブクラスに (短い) 加算、減算などのメソッドが必要だと思いますが、ロジックを削減したい重複は最小限に。ただし、サブクラスのオブジェクトを返す必要があり、これをスーパークラスのメソッドから行うのは難しそうです。これはリフレクションを使用して実行できると思いますが、サブクラス メソッドの最後にキャストを行う必要があることがわかります。リフレクションはコストがかかる可能性があると言われています...これまでに思いついた最高のものは次のとおりです。

DistanceQuantity (および他の同様のもの) で:

public DistanceQuantity() {     
}

public DistanceQuantity add(DistanceQuantity d1) {
    DistanceQuantity dn = new DistanceQuantity(); 
    Object o = super.add(dn, this, d1, DistanceUnit.REF_UNIT);
    return (DistanceQuantity) o;
}

DimensionQuantity で (関連性の低いいくつかのステートメントを差し引いて):

public Object add(DimensionQuantity dn, DimensionQuantity d1, DimensionQuantity d2, 
  AbstractUnit au) {
    dn.unit = au;
    dn.scalar = d1.scalar + d2.scalar;
    dn.units = dn.scalar;    
    return dn;   
}

より無駄のないコードを思い付くことができる人はいますか?それはまだ型安全です? ティア

4

3 に答える 3

11

次のようにジェネリックを使用できます。

public abstract class DimensionQuantity<T extends DimensionQuantity>{
    public abstract T add(T parameter);
}

そして、あなたはそれを次のように拡張します:

public class DistanceQuantity extends DimensionQuantity<DistanceQuantity>{
    public DistanceQuantity add(DistanceQuantity parameter){
        //Whatever
        return null;
    }
}

そして、最初の質問については、サブクラスの 1 つを使用するスーパークラスを持つことは本当に悪い考え (そして悪い習慣) です。


資力 :

同じトピックで:

于 2010-08-30T19:18:08.283 に答える
0

ディメンションの列挙を作成します。

public enum Dimension { AREA, DISTANCE,...}

サブクラスを破棄します。代わりに、DimensionQuantity オブジェクトのみを作成し、作成時に設定された (不変の) Dimension をそれぞれに強制します。

DimensionQuantity で追加を実装し、最初に追加される 2 つの量の次元が同じであることを確認します。

出来上がり!より少ないクラス、タイプ セーフ、重複コードなし。

于 2010-08-30T20:41:02.307 に答える
0

Java 6 では、そのようなことを試すことができます。しかし、ジェネリックを使用することも良い考えです:

public abstract class DimensionQuantity {

    protected int quantity;

    public DimensionQuantity (int quantity) {
        this.quantity = quantity;
    }

    public abstract DimensionQuantity add(DimensionQuantity dq);
}

public class DistanceQuantity extends DimensionQuantity {

    public DistanceQuantity(Quantity quantity) {
        super(quantity);
    }

    /* 
     * A sub-class as return type is authorized.
     * If dq is not a DistanceQuantity, a ClassCastException is thrown, but you can change this.
     */
    @Override 
    public DistanceQuantity add(DimensionQuantity dq) throws ClassCastException {
        return new DistanceQuantity(this.quantity + (DistanceQuantity) dq.quantity);
    }
}
于 2010-08-30T19:23:45.150 に答える