初始化scala中某个特征内的特征

初始化scala中某个特征内的特征,scala,composition,traits,Scala,Composition,Traits,下面是一个例子: 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

下面是一个例子:

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)
  }
}
我对trait LoggedDataAccess中记录器和数据访问的初始化感到有点困惑。在REPL中,当我键入此代码时,会出现以下异常:

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

trait真的可以这样初始化吗?

trait不能实例化,但您可以创建trait匿名实现的实例:

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
scala>特质测试
定义性状测验
scala>新测试
:9:错误:特质测试是抽象的;无法实例化
新测试
^
scala>新测试{}
res0:Test=$anon$1@7fafd333
scala>带有测试的新对象
res1:Test=$anon$1@4fe11d82

newtest{}
newobjectwithtest
的意思相同。他们创建新的匿名类并立即实例化它。

当然。但详细说明实际完成的工作可能会有所帮助_ray@DominicBou-萨姆拉:我已经更新了我的答案。这就是你的意思吗?