2012-05-04 72 views
1

我有一個看起來像這樣的域模型:如何將特徵添加到案例類?

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映射生成的applyunapply方法。

回答

2

它的工作原理確定對我來說:

>scala 
Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1. 
7.0). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

case class Account(id: Int, name: String) 

trait BalanceTotal { 
    def balance: BigDecimal 
} 
val enrichedAccount = new Account(1, "foo") with BalanceTotal { 
    override val balance = BigDecimal(44) 
} 

// Exiting paste mode, now interpreting. 

defined class Account 
defined trait BalanceTotal 
enrichedAccount: Account with BalanceTotal = Account(1,foo) 
+0

嗯,你說得對。它看起來像問題是我的實際代碼看起來像{for {Account(id,name,foo)< - accounts} {yield new Account(id,name,foo){...}}這是關閉的用法 - 導致問題的變量。 – Bill

+1

@Bill您的新示例是錯誤的,因爲您已將'yield'關鍵字放在大括號內(以及缺少'new')。它必須在'for {...}'之後直接出現。修復它,它的工作。 –

+0

您的示例有效,但我的完整代碼片段沒有。我想知道這與ScalaQuery有什麼關係 – Bill

1

您的例子並不因爲缺少new的工作。 Account(id, name)實際上調用Account.apply(id, name)並返回Account您不能撥打withnew Account(id, name) with BalanceTotal被翻譯成一個匿名類,其延伸Account與。希望有助於理解你的代碼不起作用的原因。

+0

進一步閱讀:我嘗試使用'新帳戶(...)',並得到了一個不同的錯誤。 – Bill

1

您的問題不在於收益率。使用括號如下,它將工作:

for (Acount(id, name) <- accounts) yield 
    (new Account(id, name) with BalanceTotal { 
    override val balance = BigDecimal(42) 
    }) 
相關問題