sc_*_*ray 3 scala traits composition
在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)
}
}
Run Code Online (Sandbox Code Playgroud)
我对Traget LoggedDataAccess中Logger和DataAccess的初始化感到有些困惑.在REPL中,当我输入此代码时,我得到以下异常:
error: trait Logger is abstract; cannot be instantiated
val logger = new Logger
Run Code Online (Sandbox Code Playgroud)
实际上可以像这样初始化特征吗?
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
Run Code Online (Sandbox Code Playgroud)
new Test{}并且new Object with Test意思相同.他们创建新的匿名类并立即实例化它.
| 归档时间: |
|
| 查看次数: |
504 次 |
| 最近记录: |