我有一個看起來像這樣的域模型:如何將特徵添加到案例類?
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`
我認爲這與使案例類工作的伏都教有關。
是否有可能做我想做的事情?
更新:進一步考慮後,我想這與禁止案例類繼承有關。但是我確實需要在這裏使用case class magic:我依靠爲我的ScalaQuery映射生成的apply
和unapply
方法。
嗯,你說得對。它看起來像問題是我的實際代碼看起來像{for {Account(id,name,foo)< - accounts} {yield new Account(id,name,foo){...}}這是關閉的用法 - 導致問題的變量。 – Bill
@Bill您的新示例是錯誤的,因爲您已將'yield'關鍵字放在大括號內(以及缺少'new')。它必須在'for {...}'之後直接出現。修復它,它的工作。 –
您的示例有效,但我的完整代碼片段沒有。我想知道這與ScalaQuery有什麼關係 – Bill