在Swing和Wicket应用程序中,覆盖框架提供的类中的方法是正常的。例如:
val form = new Form("form") {
override def onSubmit() { println("Form was submitted") }
}
示例Form的位置可以定义为:
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版本有意义吗?
答案 0 :(得分:1)
你是对的,你不能同时创建一个覆盖方法的匿名类,然后再混合一个特征。但是有一个简单的方法:在特征中定义另一个方法(例如abstract def mySubmit
),然后在子项中填写(或者让它在默认情况下执行一些有用的操作并在需要时覆盖它)。
然后,您可以先混合错误处理程序,然后覆盖匿名块中的新方法。