2015-08-18 39 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