使用特征时的Scala和diamond继承

使用特征时的Scala和diamond继承,scala,diamond-problem,Scala,Diamond Problem,给定特征: trait HasSize { def size() : Int } trait StorageTrait extends HasSize { def something() : Unit } trait YetAnotherStorageTrait extends HasSize { def anotherSomething() : Unit } 我想创建一个类 class InMemoryStorage extends StorageTrait with Yet

给定特征:

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的方法size返回的内容与方法YetAnotherStorageTrait不同(它仍然是一个大小,但属于不同的集合)


在Scala中设计这种情况的正确方法是什么?

如果我正确理解了这个问题,那么您的类继承了对
size
方法做出不同响应的特性?那么,除了使用合成而不是混合,没有办法解决这种模糊性

class InMemoryStorage
  def mainStorage: StorageTrait
  def auxStorage: YetAnotherStorageTrait

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

这就是你所关注的吗?

如果我正确理解了这个问题,你有一个类继承了对
size
方法有不同反应的特征?那么,除了使用合成而不是混合,没有办法解决这种模糊性

class InMemoryStorage
  def mainStorage: StorageTrait
  def auxStorage: YetAnotherStorageTrait

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

这就是您所关注的吗?

不太可能,我正在寻找一种将方法实现“绑定”到trait的方法。因此,无论何时通过StorageTrait访问该类,都会使用一个“大小”,如果通过“YesAnotherStorageTrait”访问该类,则会使用另一个实现。当无法在InMemoryStorage类型的实例上调用“size”时,我准备付出代价,因为这没有多大意义。这是不可能的,您不能“重载”具有相同签名的方法。如果同时使用这两种方法,则必须声明哪一种方法覆盖
size
方法。如果您希望它们独立运行,则需要使用私有大小方法;这仍然使publicsize方法模棱两可,因此您不应该这样做。上面的组合有什么问题?如果你调用
mainStorage
,它将正确地使用它的大小,而对于
auxStorage
,这也是正确的吗;虽然我仍然认为组合更好,但这可能会向您展示另一种可能性。不是真的,我正在寻找一种将方法实现“绑定”到trait的方法。因此,无论何时通过StorageTrait访问该类,都会使用一个“大小”,如果通过“YesAnotherStorageTrait”访问该类,则会使用另一个实现。当无法在InMemoryStorage类型的实例上调用“size”时,我准备付出代价,因为这没有多大意义。这是不可能的,您不能“重载”具有相同签名的方法。如果同时使用这两种方法,则必须声明哪一种方法覆盖
size
方法。如果您希望它们独立运行,则需要使用私有大小方法;这仍然使publicsize方法模棱两可,因此您不应该这样做。上面的组合有什么问题?如果你调用
mainStorage
,它将正确地使用它的大小,而对于
auxStorage
,这也是正确的吗;虽然我仍然认为作文更好,但这可能会给你展示另一种可能性。