[英]Override a trait method for final class in Scala
考虑以下:
trait TestTrait {
def doStuff()
}
final class TestClass {
// ...
}
我想实例化一个实现特质中方法的TestClass实例。 以下内容无法编译:
// Illegal inheritance from final class TestClass
val t = new TestClass with TestTrait {
def doStuff() {
println("doing stuff")
}
}
这是有道理的,因为创建的匿名类将扩展最终类。 我真正想要的是将特性的匿名实现混入最终类的实例中。
以下工作,但似乎有点回旋处。 没有声明的trait实现,有没有办法直接做到这一点?
trait TestTraitImpl extends TestTrait {
def doStuff() {
println("doing stuff")
}
}
val t = new TestClass with TestTraitImpl
事实证明,后者也不能。
final class TestClass
trait TestTrait
val t = new TestClass with TestTrait
显然,任何Foo with Bar
都是创建一个新的匿名类型,因此最终类不能具有mixin的特征。 这为最终的类添加了很大的理论意义,因为它不仅阻止了继承的概念,而且还阻止了可堆叠的修改。
在两种情况下,方法解析规则不同。 在第一种情况下,首先根据类型的方法/属性构造一个匿名类:
final class TestClass with TestTrait
然后您尝试覆盖该方法,该方法与TestClass的最终限定符冲突。
在第二种情况下,您明确指定要覆盖TestTrait行为, 然后将覆盖的行为混合到TestClass中。
我认为使用第二种方法非常好,并且可以更清楚地传达其意图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.