2014-07-09 8 views
8

Gibt es eine Möglichkeit, eine andere Klasse aus einer anonymen Klasse in Scala zu erweitern? Ich bedeutet soviel wieScala Wie zu verwenden erstreckt sich mit einer anonymen Klasse

abstract class Salutation { 
    def saybye(): String = "Bye" 
} 

class anotherClass() { 
    def dummyFunction() = { 

    val hello = new { 
     def sayhello(): String = "hello" 
    } extends Salutation 

    val hi = hello.sayhello //hi value is "Hello" 
    val bye = hello.saybye //bye value is "bye" 
    } 
} 

Antwort

7

Yep, und es sieht so ziemlich das gleiche, wie es in Java tut:

abstract class Salutation { 
    def saybye: String = "Bye" 
} 

val hello = new Salutation { 
    def sayhello: String = "hello" 
} 

val hi = hello.sayhello 
val bye = hello.saybye 

Wenn Salutation ist eine abstrakte Klasse oder Merkmal mit einer sayhello Methode mit der gleichen Signatur, haben Sie eine Implementierung bereitgestellt; sonst haben Sie eine Instanz eines anonymen Strukturtyp erstellt:

hello: Salutation{def sayhello: String} 

Beachten Sie, dass Reflexion auf die sayhello Methode aufruft (wegen der Art und Weise Strukturtypen implementiert werden in Scala) beinhalten, so dass, wenn Sie diese verwenden Methode schwer sollten Sie wahrscheinlich ein neues Merkmal oder eine neue Klasse definieren.

+0

Ich habe es nicht zuerst angegeben, aber ja Anrede ist abstrakt ... Anrede haben keine sayHello, aber es hat eine andere Funktion, die ich brauche und nutzen möchte. Gibt es einen anderen Weg, ohne eine "echte" Klasse zu schaffen? – frank

+0

Ja, der oben angegebene Code funktioniert, und Sie erhalten eine Instanz von 'Salutation {def sayhello: String}', mit der Sie beide Methoden aufrufen können. –

+0

Hmmm ich soll es so verwenden: „val hallo: Anrede {def sayHello: String}“ Wenn ja, wie ich definieren, was SayHello tut und wie ich es instanziiert? – frank

1

Sie tun müssen:

val hello = new Salutation { 
    def sayhello(): String = "hello" 
} 
+0

Sie haben mich eine Minute geschlagen, aber ich denke nicht, dass diese Art von kontextloser, Code-only-Antwort in der Regel eine gute Sache auf Stack Overflow ist - besonders in einem Fall wie diesem, wo es viele potenziell verwirrende Nuance gibt . –

+0

Es tut mir leid, meine Frage war nicht vollständig ... Ich änderte es, sollte jetzt klarer sein :) – frank

Verwandte Themen