2013-01-06 66 views
1

鑑於性狀:Scala和使用時菱形繼承特質

trait HasSize { 
    def size() : Int 
} 

trait StorageTrait extends HasSize { 
    def something() : Unit 
} 

trait YetAnotherStorageTrait extends HasSize { 
    def anotherSomething() : Unit 
} 

我想創建一流

class InMemoryStorage extends StorageTrait with YetAnotherStorageTrait { 
    //... 
} 

現在,方法大小StorageTrait的返回比法YetAnotherStorageTrait不同的東西(它仍然是一個大小,但不同的集合)。

在Scala中設計這種案例的正確方法是什麼?

回答

1

如果我正確地理解了這個問題,你有一個類繼承了size方法有不同反應的特性?那麼就沒有辦法解決這個歧義,而不是使用組合來代替mixin。

class InMemoryStorage 
    def mainStorage: StorageTrait 
    def auxStorage: YetAnotherStorageTrait 

    def mainSize = mainStorage.size 
    def auxSize = auxStorage.size 
} 

這是你正在尋找什麼?

+0

不是真的,我正在尋找一種方法來將方法實現「綁定」到特徵。因此,無論何時通過StorageTrait訪問類,都會使用一個「大小」,如果通過「YesAnotherStorageTrait」訪問,則使用另一個實現。如果InMemoryStorage類型的實例無法調用「size」,我已經準備好支付罰款,因爲它沒有多大意義。 – jdevelop

+1

這是不可能的,你不能「重載」一個具有相同簽名的方法。如果你混合使用,你必須聲明哪一個覆蓋'size'方法。如果您希望他們獨立行事,您需要使用私人大小的方法;這仍然使公開大小的方法模糊不清,所以你應該不這樣做。上面的組合有什麼問題 - 如果你調用mainStorage,它會正確地使用它的大小,對於'auxStorage'也是正確的。 –

+0

好吧,謝謝,現在很清楚 – jdevelop