2015-08-18 34 views
0

我使用的喷雾,有一个基本路线特点,它定义了一些应该实现的功能...喷雾:在性状重写功能

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

    lazy val serviceBaseRoute = ... 

然后我MIXIN这种特质对其他一些性状...

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之后的MyRoute2的值覆盖了MyRoute1的值之后呢? 那么实现这种保存每个特征中定义的覆盖的最佳方式是什么? 我是否需要将MyRoute1和MyRoute2定义为对象?

感谢

+0

'serviceBaseRoute'似乎并没有得到任何地方使用?它是否在'myRoute1'和'myRoute2'中使用? – mattinbits

+0

对不起!我已经编辑它以显示它在哪里使用... val myRoute1 = serviceBaseRoute ...实质上,两条路线都包含类似的逻辑,但函数覆盖定义每条路线不同的位置,服务基线路线调用这些覆盖的函数。 – fatlog

+0

我越是想到这一点,我越是意识到它只是设计得非常糟糕。当然,这些功能在混合它们作为特征时会被覆盖... – fatlog

回答

1

根据您的意见,其目的是在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 
     } 
    } 
} 
+0

这对我仍然存在问题。当你将两条路由(MyRoute1和MyRoute2)混入到V1Route中时,编译器会抱怨在两个特征中声明了f1Impl()和f2Impl()方法名称冲突。这似乎是钻石问题......我本来也想在基础路线类中声明这些方法为抽象的,以便在扩展特征时必须实施它们。但是,在扩展类中执行此操作并使用override只会导致正在使用的其中一个声明。就像我说的,也许这只是一个糟糕的设计案例? – fatlog

+0

我的懒惰是他们有相同的名字,他们不需要(也不应该因为你强调)。我的想法是,由于'serviceBaseRoute'需要被实现来满足'ServiceBaseRoute'特性,并且由于减法需要调用这个方法,所以他们被迫提供符合'serviceBaseRoute'要求的函数的实现。 – mattinbits

+0

是的,我明白你的意思了。谢谢! – fatlog