2013-12-08 62 views
16

最終方法不能在子類中重寫。但是憑藉Scala的魔力,這似乎是可能的。重寫最終方法

考慮下面的例子:

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

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

在對象TestObject方法doIt具有不性狀Test相同的簽名doIt。因此doIt被重載而不是被重載。但要doIt正常通話總是調用TestObject方法:

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

問題: 我怎樣才能呼籲TestObject原來的方法doIt。這是可能的還是這種方法「重寫」?

+0

爲什麼斯卡拉視它爲不同的簽名?是因爲第一是方法,第二是功能? – SzymonPajzert

回答

15

您可以使用TestObjectTest這樣的:

(TestObject: Test).doIt 
+0

+1。使用類型歸屬確實比鑄造更好。 –

1

試試這個:

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

難道你不認爲'asInstanceOf'在這裏過度殺傷了嗎? – senia

6

另一個一點點hackisch方法是調用doIt方法與命名參數是這樣的:

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