3

Scala in Depthには、次の例があります。

trait Logger {
  def log(category: String, msg: String) : Unit = {
       println(msg)
  }
}

trait DataAccess {
  def query[A](in: String) : A = {
     ...
  }
}

trait LoggedDataAccess {
  val logger = new Logger
  val dao = new DataAccess

  def query[A](in: String) : A = {
     logger.log("QUERY", in)

     dao.query(in)
  }
}

トレイトLoggedDataAccessでのLoggerとDataAccessの初期化に少し混乱しています。REPLでこのコードを入力すると、次の例外が発生します。

 error: trait Logger is abstract; cannot be instantiated
       val logger = new Logger

特性は実際にそのように初期化できますか?

4

1 に答える 1

8

トレイトをインスタンス化することはできませんが、トレイトの匿名実装のインスタンスを作成できます。

scala> trait Test
defined trait Test

scala> new Test
<console>:9: error: trait Test is abstract; cannot be instantiated
              new Test
              ^

scala> new Test{}
res0: Test = $anon$1@7fafd333

scala> new Object with Test
res1: Test = $anon$1@4fe11d82

new Test{}new Object with Test同じ意味です。彼らは新しい匿名クラスを作成し、すぐにインスタンス化します。

于 2012-12-05T08:03:11.213 に答える