また昔買った「デザインパターン入門講座」本のサンプルを実装してみました。
- 「File」-「Open」からファイル選択ダイアログを開く
- 「File」-「Exit」からプログラムを終了する
- 「Red」ボタンを押下すると背景が赤になる
このサンプルを実装してみて思ったのですが、Scalaはこの方法でイベント処理を実装するのに不向きなような気がします。 サンプルで実装されているアクションの実行方法は、
- ボタン、メニューのコンポーネントオブジェクトにCommandオブジェクトを保持するためのインタフェースを追加する
- コンポーネントにCommandオブジェクトを追加する
- イベント発生時にイベントオブジェクトからイベント発生元のコンポーネントを取得する
- コンポーネントからコマンドを取り出し実行する
というものなのですが、4.のコンポーネントからコマンドを取り出すには、型キャスト(アンボクシング?)が必要になります。
ジェネリクスによる型認識を徹底的に駆使して、型付言語でありなが型を意識することなく実装していくことを意識して設計されているScalaなのに、型キャストをしなければいけないのはいかがなものかと思ってしまうわけです。
ScalaではScalaなりのアクションの実装方法があるような気がするんですが、それがなんだかは全く検討がつきません。
そのうち気付くかな?でも、そこまで Scala + Swing を追求していこうとも思っていなんですが・・・・。
型キャストはasInstanceOf[T]というメソッドで行うことができます。
実装例は下記のとおりになります。reactions += { case ButtonClicked(a) => a.asInstanceOf[CommandHolder].command.execute }本サンプルのソースはこちら