在Scala中覆盖最终类的特征方法

时间:2013-08-04 01:51:08

标签: 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 TestTraitImpl extends TestTrait {
  def doStuff() {
    println("doing stuff")
  }
}

val t = new TestClass with TestTraitImpl

2 个答案:

答案 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中。

我认为使用第二种方法完全没问题,并且它更清楚地表达了意图。