1

Swing および Wicket アプリケーションでは、フレームワークによって提供されるクラスのメソッドをオーバーライドするのが普通です。例えば:

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 バージョンで意味を成すでしょうか?

4

1 に答える 1

1

メソッドをオーバーライドする匿名クラスを作成し、その後、特性を混在させることはできません。しかし、それを回避する簡単な方法があります: トレイト (例: abstract def mySubmit) で別のメソッドを定義し、それを子に入力します (または、デフォルトで何か有用なことを実行し、必要に応じてオーバーライドします)。

次に、最初にエラーハンドラーを混ぜて、無名ブロックで新しいメソッドをオーバーライドできます。

于 2012-07-10T18:18:31.990 に答える