0

特に sNumberとして扱いたい Grails ドメイン クラスがたくさんあります。Integerほとんどの場合、それらはメタデータとして使用されるいくつかの追加のプロパティを持つ単なる数値です。次に例を示します。

class Score {

    String meaning

    Integer value

    static hasMany = [responses:Response]

    static constraints = {
        meaning blank: false, maxSize: 100, unique: true
        value min: 1, unique: true // Assume we're using a base-1 ranking system, where 1 is the lowest
    }
}

フィールドに追加しようとしまし@Delegatevalueが、何の影響もないようでした: まだできません7 + myScoreでした. Integer には一致する署名がないため、メソッド例外が欠落しているだけplus(Score)です。

@Delegateうまくいかないように見えるので、これを行う正しい方法は何ですか?

注: ドメイン クラスCollectionをメタ データを含むさまざまな に変換する必要もありますが、同じ解決策になると思います。

4

4 に答える 4

0

You answer can be operator overloding. Here you are overloading the plus method to operate with integers and doubles:

class Score {
    ...
    int plus(int otherValue){
        return otherValue + value
    }

    double plus(double otherValue){
        return (value as double) + otherValue
    }

    // And you can avoid my pitfall overriding asType method
    Object asType(Class clazz) {
        if (clazz == Integer) {
            return value         
        }
        else if(class == Double){
            return value as Double
        }         
        else {             
            super.asType(clazz)         
        }     
    }    

}

assert new Score(value: 4) + 15 == 19
assert new Score(value: 4) + 15.32 == 19.32
assert 15.32 + (new Score(value: 4) as Double) == 19.32
assert 15 + (new Score(value: 4) as Integer) == 19
于 2013-01-28T03:46:05.290 に答える
0

メタクラスにplus演算子のオーバーロードを追加します。Number

Number.metaClass.plus = { Score s -> delegate + s.value }

これをアプリの BootStrap.groovy またはdoWithDynamicMethodsプラグインに追加します。

編集:

コメントで指摘されているようにScore、操作の左側にある場合、これは機能しません。plusそれを処理するメソッドをScoreクラスに追加します。

Number plus(Number n) { value + n }
于 2013-01-27T21:31:05.717 に答える
-1

番号を拡張することもできます。

class Score extends Number {
   Integer value

   public int intValue() { return value }
   public double doubleValue() { return value }
   public long longValue() { return value }
   public float floatValue() { return value }
}

Score sc = new Score( value: 5 );

println 10 + sc
于 2013-01-27T23:42:45.923 に答える