我正在尝试在一个对类型递归的特性中编写一个方法,但是我遇到了一个问题,我无法以这样的方式编写基本情况,即编译器确信我知道我是什么我正在做。
这是一个要点:
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
,不会调用super
,DerivedInheritableTrait
包含super
调用,但是在那里有没有更好的方法来解决这个问题?
我希望能够做的是super.asInstanceOf[InheritableTrait].doSomething()
,但这似乎不可能。
答案 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()
}