你如何在Scala特质中施展超级?

时间:2013-07-14 19:23:38

标签: scala inheritance traits

我正在尝试在一个对类型递归的特性中编写一个方法,但是我遇到了一个问题,我无法以这样的方式编写基本情况,即编译器确信我知道我是什么我正在做。

这是一个要点:

trait InheritableBehavior {
  def superClassWithInheritableBehavior: Option[Class[_]] = {
    // reflection and magic (from some library's code)
  }

  def doSomething() {
    if (this.superClassWithInheritableBehavior.isDefined) {
      super.doSomething()
    } else {
      // base case here, which relies on local fields
    }
  }
}

编译器建议我用doSomething()标记abstract override,但没有具体的实现。一切都在那一种方法中。

我想我可以将这个特性分成两个 - BaseInheritableTrait,不会调用superDerivedInheritableTrait包含super调用,但是在那里有没有更好的方法来解决这个问题?

我希望能够做的是super.asInstanceOf[InheritableTrait].doSomething(),但这似乎不可能。

1 个答案:

答案 0 :(得分:1)

当有人确信我们不知道我们在做什么时,编译器是正确的。

我不确定你的意思是“没有具体的实施。”

通常,abstract override意味着您将与具有具体实现的类混在一起。否则,就没有什么可以调用的。

可能,你的意思是,“我有一个带有InheritableTrait的类,我想扩展它并再次混合在InheritableTrait中。”但实际上,你不能这样做。你的混音线性化了一次。

最近有一个问题有一个很好的答案,我会尽力找到你。也许我们可以将其标记为欺骗。

更新:此处a similar recent question可能有助于回答或帮助改善您的问题。它包括一个精细而彻底的答案,但坦率地说,我更喜欢另一个没有爱但包含有趣代码的答案。

考虑:

  

有没有更好的方法来解决这个问题?

也许您正在寻找的是一种自我类型,在这里您要指明您与某些东西混在一起:

trait Me { _: Konkret =>
  def run() = concrete()
}

也许有不同种类的Konkret并且您想要反思地决定要做什么?

或许你只想要一个模板方法:

trait Me {
  def doSomething(): Unit
  def run() = doSomething()
}