你如何在Scala特质中施展super?

你如何在Scala特质中施展super?,scala,inheritance,traits,Scala,Inheritance,Traits,我试图用一种对类型递归的特性来编写一个方法,但是我遇到了一个问题,我不能以这样一种方式来编写基本情况,编译器确信我知道我在做什么 这里有一个要点: trait InheritableBehavior { def superClassWithInheritableBehavior: Option[Class[_]] = { // reflection and magic (from some library's code) } def doSomething() {

我试图用一种对类型递归的特性来编写一个方法,但是我遇到了一个问题,我不能以这样一种方式来编写基本情况,编译器确信我知道我在做什么

这里有一个要点:

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

我想我可以把这个特性分成两部分--
baseInheritableTracit
,它不调用
super
,而
deriveInheritableTracit
包含
super
调用,但是有没有更好的方法来处理这个问题呢


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

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

我不知道你所说的“没有具体的实施”是什么意思

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

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

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

更新:这里有一些可能有助于回答或改进您的问题。它包括了一个很好的和彻底的答案,虽然坦率地说,我更喜欢另一个答案,没有收到爱,但包括有趣的代码

考虑:

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

也许您在这里寻找的是一种自我类型,您希望指定您与某些东西混合在一起:

trait Me { _: Konkret =>
  def run() = concrete()
}
可能有不同类型的
Konkret
,您想反射性地决定该做什么

或者,您可能只需要一个模板方法:

trait Me {
  def doSomething(): Unit
  def run() = doSomething()
}
我所说的“无具体实现”是指相同的方法适用于基类和任何派生类,因此,如果编译器不坚持说抽象重写,那么调用super的方法将作为具体实现工作。我将尝试两种类型的特质。虽然不干净,但我想我可以让它工作。