次のようなドメイン モデルがあります。
case class Account(id: Int, name: String)
trait BalanceTotal {
def balance: BigDecimal
}
私の目標は、単純で軽量なケース クラスを用意し、次にバランス計算を行うメソッド内でのみ作成されるAccount
拡張クラスを作成することです (これはコストがかかります)。Account with BalanceTotal
この構造を使用すると、軽量のオブジェクトを持っているだけでバランスが取れているとは考えていないことを静的に確認できます。もちろん、私は について知ってOption
いますが、タイプチェッカーが、バランス強化されたオブジェクトが必要な軽量オブジェクトをコードが使用しないようにしたいのですが、その逆も同様Option
です。
とにかく、私がやりたいことは次のとおりです。
for{ Account(id,name) <- accounts } {
yield Account(id, name) with BalanceTotal {
override val balance = BigDecimal(44)
}
}
しかし、それは失敗します:
';' expected but 'with' found
new Account
の代わりに使用しようとすると、次のAccount
ようになります。
super constructor arguments cannot reference unconstructed `this`
ケースクラスを機能させるブードゥー教と関係があると思います。
私がやろうとしていることをすることは可能ですか?
更新:さらに検討すると、これはケースクラスの継承の禁止と関係があると思います。しかし、ここではケース クラス マジックが本当に必要です。生成されたapply
メソッドunapply
と ScalaQuery マッピングに依存しています。