抱歉,如果这是一个愚蠢的标题,我不知道如何清楚地表达
说我有一个记录特征:
trait Logging {
def log(s:String)
}
然后是一些实现
trait PrintlnLog extends Logging {
def log(s:String) { println(s) }
}
我喜欢这个
class SomeProcess { this:Logging =>
def doSomeJunk() {
log("starting junk")
...
log("junk finished")
}
}
我可以像
一样使用这个类val p = new SomeProcess () with PrintLog
p.doSomeJunk()
现在如果我有这个
class SubProcess { this:Logging =>
def doSubJunk() {
log("starting sub junk")
...
log("finished sub junk")
}
}
class ComplexProcess { this:Logging =>
def doMoreJunk() {
log("starting more junk")
val s = new SubProcess with // ??? <-- help!
s.doSubJunk()
log("finished more junk")
}
}
在ComplexProcess中我想要在混合到ComplexProcess中的相同日志记录特征中实例化一个SubProcess混合,但ComplexProcess不知道那是什么。有没有办法获得它的参考?
答案 0 :(得分:4)
你做不到。在这种情况下,你可能会做这样的事情:
trait WithSubProcess {
def s: SubProcess
}
class ComplexProcess { this: Logging with WithSubProcess ... }
答案 1 :(得分:2)
根据定义,答案是否定的。 Scala是一种静态类型语言,因此这些信息仅在编译时才可用。有了更广泛的反思API和一些组合/组装黑客,未来可能会有所可能,尽管Paolo提到危险地接近面向方面编程。
答案 2 :(得分:1)
日志记录是面向方面编程的典型案例。您可以尝试将AspectJ与scala一起使用:请参阅this article by Jonas Boner