【问题标题】:Scala and diamond inheritance when using traits使用特征时的 Scala 和菱形继承
【发布时间】:2013-01-06 11:16:39
【问题描述】:

给定特征:

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 中设计这种情况的正确方法是什么?

【问题讨论】:

    标签: scala diamond-problem


    【解决方案1】:

    如果我正确理解了这个问题,您有一个继承了对size 方法响应不同的特征的类?那么除了使用组合而不是mixin之外,没有其他方法可以解决这种歧义。

    class InMemoryStorage
      def mainStorage: StorageTrait
      def auxStorage: YetAnotherStorageTrait
    
      def mainSize = mainStorage.size
      def auxSize  = auxStorage.size
    }
    

    这就是你所关心的吗?

    【讨论】:

    • 不是真的,我正在寻找一种将方法实现“绑定”到特征的方法。因此,每当通过 StorageTrait 访问该类时,都会使用一个“大小”,如果通过“YesAnotherStorageTrait”访问它,则使用另一个实现。当无法在 InMemoryStorage 类型的实例上调用“大小”时,我准备支付罚款,因为它没有多大意义。
    • 这是不可能的,你不能“重载”具有相同签名的方法。如果混合使用两者,则必须声明哪一个会覆盖 size 方法。如果希望它们独立运行,则需要使用私有大小方法;这仍然使 public size 方法模棱两可,所以你真的不应该这样做。上面的组合有什么问题——如果你调用mainStorage,它会正确使用它的大小,而auxStorage也是如此?
    • 刚刚偶然发现across this answer;虽然我仍然认为构图更好,但这可能会向您展示另一种可能性。
    猜你喜欢
    • 2020-11-11
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2018-12-28
    • 2015-07-25
    • 1970-01-01
    相关资源
    最近更新 更多