使用 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

呜呼!