Scala 性状范围
我正在学习Scala和Akka,我遇到了一个让我困惑的例子。以下代码示例位于1个文件中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(
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
是一个很好的做法,即使这是可能的。有些用例是强制的。