scala - 将自我类型注释类传递给子对象

时间:2012-03-05 16:34:33

标签: scala inversion-of-control

抱歉,如果这是一个愚蠢的标题,我不知道如何清楚地表达

说我有一个记录特征:

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不知道那是什么。有没有办法获得它的参考?

3 个答案:

答案 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