覆盖最终方法

时间:2013-12-08 12:12:09

标签: scala override final

无法在子类中重写最终方法。但是,有了Scala的魔力,这似乎是可能的。

考虑以下示例:

trait Test {
  final def doIt(s: String): String = s
}

object TestObject extends Test {
  def doIt: String => String = s => s.reverse
}

对象doIt中的方法TestObject与特征doIt中的Test的签名不同。因此doIt被重载而不是被覆盖。但是,doIt的正常通话始终会调用TestObject中的方法:

val x = TestObject.doIt("Hello")                //> x  : String = olleH

问题: 如何在doIt上调用原始方法TestObject。这是可能的还是这种方法“有点被覆盖”?

3 个答案:

答案 0 :(得分:15)

您可以TestObject使用Test,如下所示:

(TestObject: Test).doIt

答案 1 :(得分:6)

另一个有点hackisch的方法是用这样的命名参数调用doIt:

val x = TestObject.doIt(s = "Hello") 

答案 2 :(得分:1)

试试这个:

TestObject.asInstanceOf[Test].doIt("Hello")