繁体   English   中英

在Scala中为最终课程覆盖特征方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM