2013-10-22 63 views
4

我有一個特點I(中介),M(攪拌機)混合性狀和特質S(具體)。強制性狀實施方法

class M extends Something with S { 
    def baz() = foo() 
} 

trait I { 
    def foo(): { ...; bar(); ... } 
    def bar() 
} 

trait S extends I { 
    def bar() = 42 
} 

I用作MS之間的中間層,提供了一個通用接口。

我有一個實現的方法fooI調用一個方法bar(在I未實施,但其中所述)。我想實現的是,延長I所有特質必須實現bar,所以這將拋出一個編譯時錯誤,因爲bar未實現:

trait Z extends I 

這是可能的Scala呢?

P.S .:我知道Force Scala trait to implement a certain method的答案,但我不想要那種明顯的耦合。

+0

你不能強迫'特質'來實現類似的東西。 – david

+1

我很好奇,你爲什麼需要那個?只要您嘗試具體實現I(強制您提供def欄),就會收到編譯錯誤。但一個特質是由本質抽象... – Guillaume

+0

我需要它,因爲特點和具體的實現住在單獨的軟件包。這些特質在圖書館裏,沒有這些特性的具體用法。我可以在我的測試套件中測試這些特徵的正確實現。但是,如果錯誤在編譯時已經彈出(例如,在我的IDE中),我希望它更好。 – tobi

回答

1

我想過結構分型:

trait I[T<: { def:foo:Unit}] 

....

會爲你的工作?

+1

這是你在想什麼? 'M級擴展對象以S { DEF巴茲()= FOO() } 性狀我[T <:{DEF欄():單位}] { DEF FOO(){巴()} DEF巴() } 性狀S伸展I [S] { DEF巴()= 42 }' 因爲如果是這樣,那麼像 '性狀Q延伸I [Q] {}' 仍然不會拋出編譯時錯誤。 – tobi

+0

是的,我認爲那樣。 –

1

這似乎是一個用例自我類型:

trait Z { 
    self : I => 
} 

編譯器會檢查在包括Z層次結構的任何類或擴展I

+0

請問您可以添加一個例子嗎?如果'trait Z'沒有定義'bar()',我看不到編譯時錯誤。 – tobi

+0

我認爲自我類型仍然不可能強制**特質**實施某種方法。如果** class **使用'trait Z'並且'Z'沒有提供實現,則編譯器會引發錯誤。但正如我在[先前的評論](http://stackoverflow.com/questions/19513843/force-trait-to-implement-method#comment28960874_19513843)中所說,我想早點發現錯誤。 – tobi