1

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

4

1 回答 1

1

您是正确的,您不能同时创建一个覆盖方法的匿名类,然后再混合一个特征。但是有一个简单的方法:在 trait(例如abstract def mySubmit)中定义另一个方法,然后将其填充到孩子中(或者默认情况下让它做一些有用的事情,如果你愿意,可以覆盖它)。

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

于 2012-07-10T18:18:31.990 回答