3

「静的」メソッドの機能にアクセスするために、それらのメソッドでオブジェクトをインポートするよりも、ミックスインする方が望ましい場合はありますか?

メソッドの機能にアクセスしたいとしますa()a()を含むオブジェクトをインポートするのではなく、含むトレイトを拡張することはありますa()か?

次の例を見ると:

1)

trait A {
  def a() {}
}

...

class B extends A {
  val b = a()
}

対。

2)

object A {
  def a() {}
}

...

import A._
class B {
  val b = a()
}

B2 つのクラスとの間に「is-a」関係がない場合でも、最初のアプローチを好む理由はありAますか?

4

2 に答える 2

4

拡張するものはB、再インポートを続けたくないのAでしょうか?

メソッドは他の「静的」メソッドに依存しているかもしれませんが、実際には実装をオーバーライドしたいですか?

Bfinal (またはオブジェクト) であり、メソッドが実際に静的である (および で変更したい実装を参照していないB) 場合、トレイトを混在させる意味はあまりありません。唯一の例外は、暗黙的な変換が定義されている場合です。暗黙的な変換を混在させると、自分で宣言した場合よりも優先度が低くなります。

(例として、scala.LowPriorityImplicitsどれが混ざっているのかを確認してくださいscala.Predef。)

于 2013-07-19T20:15:29.673 に答える
2

レックスが言ったすべて...

また、importアーティファクト (メソッド、フィールド) を現在のスコープに持ち込みますが、新しいクラスのインターフェイスではそれらを公開しないことにも注意してください。

トレイトを混在させると、新しいクラス/トレイト インターフェイスの「一部」にすることで、アーティファクト (パブリック、プロテクト、または ...) を公開できます。

于 2013-07-19T20:22:03.497 に答える