2010-03-24 10 views
28

Soweit ich sagen kann, hat Scala Definitionen für die Enumeration Value-Klasse für Wert (Int), Wert (String) und Wert (Int, String).Überschreiben Scala Enumeration Wert

Kennt jemand ein Beispiel zum Erstellen einer neuen Value-Unterklasse, um einen anderen Konstruktor zu unterstützen?

Zum Beispiel, wenn ich eine Enumeration mit Wert (Int, String, String) -Objekte erstellen möchte, wie würde ich es tun? Ich hätte gerne alle anderen Vorteile der Enumeration-Klasse.

Danke.

Antwort

40

Die Enumeration-Werte sind Instanzen der Val-Klasse. Diese Klasse kann erweitert und eine Factory-Methode hinzugefügt werden.

object My extends Enumeration { 
    val A = Value("name", "x") 
    val B = Value("other", "y") 
    class MyVal(name: String, val x : String) extends Val(nextId, name) 
    protected final def Value(name: String, x : String): MyVal = new MyVal(name, x) 
} 

scala> My.B.id 
res0: Int = 1 

scala> My.B.x 
res1: String = y 
+2

Excellent! Funktioniert genau so, wie ich es wollte. Vielen Dank. – Ralph

+0

@Thomas Jung: Deine Idee ist brillant, aber ich konnte sie nicht benutzen. Es gab eine Warnung "importiert' My 'ist dauerhaft durch Definition des Objekts im Paket " Endlich habe ich diese Zeile hinzugefügt: Typ My = Wert zu diesem Beispiel und es hat funktioniert. Ich verstehe immer noch nicht warum, Könnten Sie es bitte erklären? –

+0

Um 'Meine' Aufzählung zu verwenden, müssen Sie zuerst importieren Sie es mit' Import My._' und fügen Sie auch den folgenden Code in das 'My' Objekt:' Typ My = MyVal', so dass Sie Zugriff auf das X-Wert. – metch

1

Eigentlich in Scala Enumeration hat eine viel einfachere Bedeutung als in Java. Zu Ihrem Zweck müssen Sie die Enumeration und ihren Wert in keiner Weise ableiten. Sie müssen lediglich Ihren eigenen Typ in seinem Begleitobjekt als val instanziieren. Auf diese Weise erhalten Sie das vertraute Zugriffsmodell von val value:MyEnum = MyEnum.Value wie in Java, was im Beispiel von Thomas Jung nicht möglich ist. Dort wirst du def value:My.MyVal = MyEnum.Value haben, was irgendwie verwirrend ist, wie es mir neben der ganzen Hackigkeit der Lösung scheint. Hier ist ein Beispiel dafür, was ich vorschlagen:

class MyEnum(myParam:String) 

object MyEnum { 
    val Value1 = new MyEnum("any parameters you want") 
    val Value2 = new MyEnum("") 
    object Value3 extends MyEnum("A different approach to instantialization which also lets you extend the type in place") 
} 

Hier können Sie ein komplizierteres Beispiel finden: Scala Best Practices: Trait Inheritance vs Enumeration

Verwandte Themen