特征范围

时间:2016-10-26 14:35:19

标签: scala

我正在学习Scala和Akka,我遇到了一个困扰我的例子。以下代码示例位于1个文件中。

class RestApi(system: ActorSystem, timeout: Timeout) extends RestRoutes {
  implicit val requestTimeout = timeout
  implicit def executionContext = system.dispatcher

  def createBoxOffice = system.actorOf(BoxOffice.props, BoxOffice.name)
}

trait BoxOfficeApi {
  import BoxOffice._

  def createBoxOffice(): ActorRef

  implicit def executionContext: ExecutionContext
  implicit def requestTimeout: Timeout

  lazy val boxOffice = createBoxOffice()

  // Uninteresting methods here
}

令我困惑的部分是createBoxOffice()特征中的BoxOfficeAPI调用。它明确指出BoxOfficeAPI具有将返回ActorRef的函数。但是,该函数的实现位于RestApi类中,该类没有对该特征的任何引用。

特质如何才能访问此方法?特质的范围是什么?

1 个答案:

答案 0 :(得分:4)

  

特质如何才能访问此方法?

我认为你错过了特质本身有一个名为createBoxOffice的抽象方法的事实:

def createBoxOffice(): ActorRef

这就是为什么它在范围内有这样一种方法。它与RestApi的声明无关。混合这种特性的人必须实施该方法。这意味着,例如,如果RestApi类决定混合BoxOfficeApi,它已经有一个可用的实现,它将使用它。例如:

class Baz extends Foo {
  override def quuux(): Unit = println("quuux")
}

trait Foo {
  def quuux(): Unit 
}