使用 mixin trait 丰富对象
Enriching object with mixin trait
我有以下结构:
trait Runner {
def run: Unit
}
trait LoggableRunner extends Runner {
abstract override def run {
println("logging enter")
super.run
println("logging exit")
}
}
class RealRunner extends Runner {
def run = println("running...")
}
这样我就可以通过以下方式登录来丰富我的 class:
val a = new RealRunner with LoggableRunner
在运行 run
方法前后添加日志信息。
现在我真正想要的是能够用特征组合scala对象。我试过同样的方法:
object RealRunner extends LoggableRunner{
def run = println("running...")
}
但我得到:method run needs override modifier
所以我尝试了:
object RealRunner extends LoggableRunner{
override def run = println("running...")
}
但我得到:method run needs abstract override modifiers
。所以我再次尝试添加摘要,得到:abstract override modifier only allowed for members of traits
.
甚至可以将特征混合到对象中吗?
我不确定它为什么会这样(确实看起来很奇怪和令人困惑,希望有更多线索的人能插话,并对此给出一些解释),但这是你可以做的你想要:
trait Runner {
def run = () // making it non-abstract, makes things a lot easier!
}
trait LoggableRunner extends Runner {
override def run = {
println("start")
super.run
println("stop")
}
def foo = "foo"
}
trait RealRunner extends Runner { self: LoggableRunner =>
override def run = println(foo) // uses things from LoggableRunner
}
object RealRunner extends RealRunner with LoggableRunner
scala> RealRunner.run
start
foo
stop
呜呼!
我有以下结构:
trait Runner {
def run: Unit
}
trait LoggableRunner extends Runner {
abstract override def run {
println("logging enter")
super.run
println("logging exit")
}
}
class RealRunner extends Runner {
def run = println("running...")
}
这样我就可以通过以下方式登录来丰富我的 class:
val a = new RealRunner with LoggableRunner
在运行 run
方法前后添加日志信息。
现在我真正想要的是能够用特征组合scala对象。我试过同样的方法:
object RealRunner extends LoggableRunner{
def run = println("running...")
}
但我得到:method run needs override modifier
所以我尝试了:
object RealRunner extends LoggableRunner{
override def run = println("running...")
}
但我得到:method run needs abstract override modifiers
。所以我再次尝试添加摘要,得到:abstract override modifier only allowed for members of traits
.
甚至可以将特征混合到对象中吗?
我不确定它为什么会这样(确实看起来很奇怪和令人困惑,希望有更多线索的人能插话,并对此给出一些解释),但这是你可以做的你想要:
trait Runner {
def run = () // making it non-abstract, makes things a lot easier!
}
trait LoggableRunner extends Runner {
override def run = {
println("start")
super.run
println("stop")
}
def foo = "foo"
}
trait RealRunner extends Runner { self: LoggableRunner =>
override def run = println(foo) // uses things from LoggableRunner
}
object RealRunner extends RealRunner with LoggableRunner
scala> RealRunner.run
start
foo
stop
呜呼!