2013-12-08 16 views
16

Endgültige Methoden können in einer Unterklasse nicht überschrieben werden. Aber mit der Magie von Scala scheint das möglich zu sein.Endgültige Methode überschreiben

betrachte das folgende Beispiel:

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

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

Verfahren doIt in dem Objekt TestObject hat nicht die gleiche Signatur wie in doIt trait Test. Somit wird doIt überladen statt überschrieben. Aber ein normaler Anruf doIt ruft immer die Methode in TestObject:

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

Frage: Wie kann ich die Original-Methode aufrufen doIt auf dem TestObject. Ist das möglich oder ist diese Methode "übergangen"?

+0

Warum Scala es als unterschiedliche Signatur behandelt? Liegt es daran, dass die erste Methode und die zweite Funktion ist? – SzymonPajzert

Antwort

15

Sie können TestObject als Test wie folgt verwenden:

(TestObject: Test).doIt 
+0

+1. Es ist in der Tat schöner, die Typenzulassung zu verwenden als zu wirken. –

1

Try this:

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

Glaubst du nicht, dass 'asInstanceOf' hier zu viel ist? – senia

6

Ein weiteres ein wenig hackisch Weg ist doIt mit benannten Parameter wie folgt zu nennen:

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