Spray:覆盖特征中的函数

Spray: Overriding functions in Traits

我正在使用 Spray 并且有一个 Base Route 特征,它定义了一些应该实现的函数...

trait ServiceBaseRoute extends HttpService {
  def function1():Type
  def function2():Type

  lazy val serviceBaseRoute = ...

然后我将这个特征与其他一些特征混合...

trait MyRoute1 extends HttpService
  with ServiceBaseRoute {
  override def function1():Type = {...}
  override def function2():Type = {...}

  val myRoute1 = serviceBaseRoute

和...

trait MyRoute2 extends HttpService
  with ServiceBaseRoute {
  override def function1():Type = {...}
  override def function2():Type = {...}

  val myRoute2 = serviceBaseRoute

最后我构建的顶层路由如下...

trait V1Routes extends HttpService
  with MyRoute1
  with MyRoute2 {

  val v1Routes = 
    pathPrefix("v1") {
      authenticate(...) {
        myRoute1 ~ myRoute2
      }
    }

编译得很好等等... 但是当我 运行 这个函数覆盖 MyRoute2 覆盖那些在 MyRoute1 中定义的。我在想这是因为我没有 MyRoute1 和 MyRoute2 的实际实例,因为它们只是简单地混合在一起,并且由于 MyRoute2 是在 MyRoute1 之后添加的,它的值会覆盖 MyRoute1 的值吗? 那么,实现此保留每个特征中定义的覆盖的最佳方法是什么? 我是否需要将 MyRoute1 和 MyRoute2 定义为对象?

谢谢

根据您的意见,目标是在 MyRoute1 和 MyRoute2 中有不同的路由,其中​​每个路由都是通过自定义 serviceBaseRoute 创建的。由于 ServiceBaseRoute 由两个函数自定义,您可以使 serviceBaseRoute 成为高阶函数,并在子特征中将这两个函数的实现传递给它:

trait ServiceBaseRoute extends HttpService {

  def serviceBaseRoute(f1: () => Type, f2: () => Type)= ???
}

trait MyRoute1 extends HttpService
with ServiceBaseRoute {

  def f1ImplA(): Type = ???

  def f2ImplA(): Type = ???

  val myRoute1 = serviceBaseRoute(f1ImplA, f2ImplA)
}

trait MyRoute2 extends HttpService
with ServiceBaseRoute {

  def f1ImplB(): Type = ???

  def f2ImplB(): Type = ???

  val myRoute2 = serviceBaseRoute(f1ImplB, f2ImplB)
}

trait V1Routes extends HttpService
with MyRoute1
with MyRoute2 {

  val v1Routes =
    pathPrefix("v1") {
      authenticate(...)
      {
        myRoute1 ~ myRoute2
      }
    }
}