0

MVC スタイルで書かれたプロジェクトがあります。ビューは次のようになります。

trait BaseView {
  def asComponent(): Component // each view can be displayed on screen
}


class ConcreteView extends Panel with BaseView  {

  def asComponent(): Component = this //ConcreteView is itself Component because it extends Panel 
}

ConcreteViewからへの暗黙的な変換を使用するようにこのコードを変更することは可能Componentです。メソッドを呼び出さずに ConcreteViewas (暗黙的な変換による) を使用できますか?ComponentConcreteView#asComponent

4

1 に答える 1

3

はい、可能です。asComponent メソッドを呼び出す BaseView から Component への暗黙的な変換を定義するだけです。

object BaseView {
  implicit def viewIsComponent(x:BaseView) : Component = x.asComponent
}

しかし、それは良い考えだという意味ではありません。scala での暗黙的な変換は非常に強力な機能です。BaseView (および継承による各 XXXView)コンポーネントである場合、val myView:SomeView のメソッドを呼び出したいときにコンポーネントのすべてのメソッドを取得することを意味します。これは名前空間を完全に混乱させ、ビューのメソッドを呼び出すのか、それが暗黙的にマップされているコンポーネントのメソッドを呼び出すのかがわからないため、危険な場合もあります。

scala ライブラリでは、暗黙的な変換から、より明示的で少し冗長な方法への移行が行われています。JavaConversionsを例にとると、scala コレクションから Java コレクションへ、およびその逆への暗黙的な変換を提供します。これは良いアイデアのように思えますが、実際には多くの問題を引き起こしています。

  • 予期しないときに発生するコンバージョン
  • 同等のJavaからの多くの追加メソッドで雑然としたscalaコレクションの名前空間
  • 変換元のメソッドと衝突する暗黙的な変換のターゲットに新しいメソッドが追加されたときの問題を見つけるのが難しい

java/scala コレクションの相互運用性を処理するために現在推奨されている方法は、より明示的なJavaConvertersを使用することです。これは、単一のメソッド asScala を Java コレクションに追加し、asJava を scala コレクションに追加します。

したがって、メソッドはそのままにしておきます。ビューをコンポーネントに実際に変換するのではなく、各ビューに必要なコンポーネントへのアクセスのみを許可するため、名前を単に .component に変更することもできます。

于 2013-07-21T08:43:48.043 に答える