我正在学习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
类中,该类没有对该特征的任何引用。
特质如何才能访问此方法?特质的范围是什么?
答案 0 :(得分:4)
特质如何才能访问此方法?
我认为你错过了特质本身有一个名为createBoxOffice
的抽象方法的事实:
def createBoxOffice(): ActorRef
这就是为什么它在范围内有这样一种方法。它与RestApi
的声明无关。混合这种特性的人必须实施该方法。这意味着,例如,如果RestApi
类决定混合BoxOfficeApi
,它已经有一个可用的实现,它将使用它。例如:
class Baz extends Foo {
override def quuux(): Unit = println("quuux")
}
trait Foo {
def quuux(): Unit
}