2013-01-06 21 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