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
}
}
}
我正在使用 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
}
}
}