0

我正在尝试在类型上递归的特征中编写一个方法,但是我遇到了一个问题,即我无法以编译器确信我知道自己在做什么的方式编写基本案例。

这是一个要点:

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,但没有具体的实现。一切都在这一种方法中。

我想我可以将 trait 分成两BaseInheritableTrait部分,一个不调用superDerivedInheritableTrait一个包括super调用,但是有没有更好的方法来处理这个问题?

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

4

1 回答 1

1

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

我不确定您所说的“没有具体实施”是什么意思。

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

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

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

更新:这是一个类似的最近的问题,可能有助于回答或帮助改进您的问题。它包括一个精细而彻底的答案,但坦率地说,我更喜欢另一个没有得到爱但包含有趣代码的答案。

考虑:

有没有更好的方法来处理这个?

也许您在这里寻找的是自我类型,您想在其中指定您与某些东西混在一起:

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

也许有不同的类型,Konkret你想反思地确定要做什么?

或者,也许您只想要一个模板方法:

trait Me {
  def doSomething(): Unit
  def run() = doSomething()
}
于 2013-07-14T19:37:46.060 回答