请考虑以下事项:
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 TestTraitImpl extends TestTrait {
def doStuff() {
println("doing stuff")
}
}
val t = new TestClass with TestTraitImpl
答案 0 :(得分:3)
事实证明,你也不能做后者。
final class TestClass
trait TestTrait
val t = new TestClass with TestTrait
显然,任何Foo with Bar
都是创建一个新的匿名类型,因此最终的类不能具有作为mixins的特征。这为使类最终成功增加了很多理论意义,因为它不仅可以防止继承的概念,还可以防止可堆叠的修改。
答案 1 :(得分:0)
两种情况下的方法解析规则不同。在第一种情况下,首先通过类型的方法/属性构造匿名类:
final class TestClass with TestTrait
和然后你试图覆盖它的方法,它与TestClass的最终限定符冲突。
在第二种情况下,您明确指定要覆盖 TestTrait 行为,然后然后将覆盖行为混合到TestClass中。
我认为使用第二种方法完全没问题,并且它更清楚地表达了意图。