0

考虑以下:

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
4

2 回答 2

4

事实证明,你也不能做后者。

final class TestClass

trait TestTrait

val t = new TestClass with TestTrait

显然,anyFoo with Bar是一种新的匿名类型的创建,因此最终类不能具有作为 mixin 的特征。这为类 final 增加了很多理论意义,因为它不仅阻止了继承的概念,而且还阻止了可堆叠的修改。

于 2013-08-06T02:48:42.570 回答
0

两种情况下的方法解析规则是不同的。在第一种情况下,首先通过该类型的方法/属性构造一个匿名类:

final class TestClass with TestTrait

然后你试图覆盖一个与 TestClass 的最终限定符冲突的方法

在第二种情况下,您明确指定要覆盖TestTrait行为,然后将覆盖的行为混合到 TestClass 中。

我认为使用第二种方法非常好,并且它更清楚地传达了意图是什么。

于 2013-08-04T02:12:53.740 回答