如何在Scala中组合覆盖可堆叠特征?

时间:2012-07-10 18:05:26

标签: scala inheritance traits

在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版本有意义吗?

1 个答案:

答案 0 :(得分:1)

你是对的,你不能同时创建一个覆盖方法的匿名类,然后再混合一个特征。但是有一个简单的方法:在特征中定义另一个方法(例如abstract def mySubmit),然后在子项中填写(或者让它在默认情况下执行一些有用的操作并在需要时覆盖它)。

然后,您可以先混合错误处理程序,然后覆盖匿名块中的新方法。