Scala 性状范围

Scala 性状范围,scala,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(

我正在学习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
}
让我困惑的是
BoxOfficeAPI
trait中的
createBoxOffice()
调用。它明确指出,
BoxOfficeAPI
具有一个函数,该函数将返回一个
ActorRef
。但是,该函数的实现位于
RestApi
类中,该类没有对trait的任何引用

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

该特质如何可能访问此方法

我认为您忽略了一个事实,即trait本身有一个名为
createBoxOffice
的抽象方法:

def createBoxOffice(): ActorRef
这就是为什么它有这样一个范围内的方法。它与
RestApi
的声明无关。无论谁混合了这种特性,都必须实现上述方法。这意味着,例如,如果
RestApi
类决定混入
BoxOfficeApi
,那么它已经有了一个可用的实现,可以使用它。例如:

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

trait Foo {
  def quuux(): Unit 
}

你完全正确。在代码示例中,我还遗漏了另一个名为
RestRoutes
的特性。这种特性将
BoxOfficeApi
RestApi
相结合,从而实现了其中定义的方法。谢谢你指出这一点!你的例子确实引发了另一个问题。您正在使用
override
关键字定义函数
Quuuux()
正在从
Foo
特性被重写。这在我发布的示例中没有使用。这是一个可选的关键字吗?@RemcoW如果你混合了这样一个特征,你可以省略
override
关键字,但是使用
override
是一个很好的做法,即使这是可能的。有些用例是强制的。