覆盖最终方法

Eri*_*rik 16 overriding scala final

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

请考虑以下示例:

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

object TestObject extends Test {
  def doIt: String => String = s => s.reverse
}
Run Code Online (Sandbox Code Playgroud)

该方法doIt中的对象TestObject具有不相同的签名doIt中的性状Test.因此doIt重载而不是重写.但正常调用doIt始终调用方法TestObject:

val x = TestObject.doIt("Hello")                //> x  : String = olleH
Run Code Online (Sandbox Code Playgroud)

问: 我怎样才能调用原始的方法doItTestObject.这是可能的还是这种方法"有点被覆盖"?

sen*_*nia 15

您可以使用TestObjectTest这样的:

(TestObject: Test).doIt
Run Code Online (Sandbox Code Playgroud)


con*_*-ae 6

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

val x = TestObject.doIt(s = "Hello") 
Run Code Online (Sandbox Code Playgroud)