2012-07-10 18 views
1

在Swing和Wicket應用程序中,覆蓋框架提供的類中的方法是正常的。例如:如何將Scala中的可堆棧特性重寫?

val form = new Form("form") { 
    override def onSubmit() { println("Form was submitted") } 
} 

凡示例形式可以定義爲:

abstract class Form(id: String) { 
    def onSubmit() 
    def error(msg: String) { println(msg) } 
} 

許多形式實現需要的錯誤處理。爲此,我創建了一個可堆疊的特點:

trait FormErrorHandler extends Form { 
    abstract override def onSubmit() { 
    try super.onSubmit() 
    catch { case e: Exception => error("error during submit " + e.getMessage) } 
    } 
} 

如果我現在嘗試結合這一點,我得到編譯器錯誤:

val form = new Form("form") { 
    override def onSubmit() { println("Form was submitted") } 
} with FormErrorHandler // DOES NOT COMPILE 

我工作圍繞它:

class MyForm extends Form("form") { 
    override def onSubmit() { println("Form was submitted") } 
} 
val form = new MyForm with FormErrorHandler 

,但它只是不會讀取;我必須命名一個通常是匿名的類。

任何建議,使這看起來不錯? 我試過的語法結構會對未來的Scala版本有意義嗎?

回答

1

你是對的,你不能同時創建一個覆蓋方法的匿名類,然後再混合一個特徵。但是有一個簡單的方法:在特徵中定義另一種方法(例如abstract def mySubmit),然後填寫孩子(或者讓它在默認情況下執行一些有用的操作,並在需要時覆蓋它)。

然後,您可以先混合錯誤處理程序並覆蓋匿名塊中的新方法。

+1

謝謝。該解決方法的缺點是它具有侵入性。知道框架的人(在這種情況下Wicket)會自動覆蓋onSubmit,而不是mySubmit。你也可以放棄堆疊性狀的「堆疊」部分。恕我直言,這些缺點是更糟的是給中間類名稱的解決方法。 – 2012-07-10 18:22:52

+1

@ErikvanOosten - 以不同順序堆疊仍然堆疊。不過,我同意,爲了讓那些瞭解該框架的人保持更多的可讀性,使代碼不那麼漂亮,可能是更好的方法。 – 2012-07-10 18:28:23