2010-03-24 16 views
28

Per quanto posso dire, Scala ha definizioni per la classe di enumerazione Rapporto qualità-prezzo (Int), Valore (String), e il valore (Int, String).Overriding Scala enumerazione Valore

Qualcuno sa di un esempio per la creazione di una nuova sottoclasse valore per sostenere un costruttore diverso?

Per esempio, se voglio creare un'enumerazione con valore (int, String, String) oggetti, come dovrei farlo? Vorrei tutti gli altri vantaggi dell'utilizzo della classe Enumeration.

Grazie.

risposta

40

valori di enumerazione sono istanza della classe Val. Questa classe può essere estesa e può essere aggiunto un metodo factory.

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

Eccellente! Funziona esattamente come volevo. Grazie. – Ralph

+0

@Thomas Jung: La tua idea è brillante, ma non potrei usarla. C'era un avvertimento "importato" My "è permanentemente nascosto per definizione dell'oggetto nel pacchetto" Infine, ho aggiunto questa riga: tipo Mio = Valore a questo esempio e ha funzionato. Ancora non capisco perché, Potresti spiegarlo per favore? –

+0

Per usare l'enumerazione 'My', devi prima importarlo con' import My._' e anche aggiungere il seguente codice nell'oggetto 'My':' type My = MyVal', così puoi accedere a x val. – metch

1

In realtà Enumerazione Scala ha un significato molto più semplice rispetto a Java. Per il vostro scopo che non c'è bisogno di sottoclasse enumerazione né il suo valore in qualsiasi modo, è solo bisogno di un'istanza per il proprio tipo di oggetto nella sua compagna come val. In questo modo otterrete il modello di accesso familiare di val value:MyEnum = MyEnum.Value come in Java, che non è possibile nell'esempio fornito da Thomas Jung. Lì avrete def value:My.MyVal = MyEnum.Value che è un po 'confuso come mi sembra oltre a tutta la scelleratezza della soluzione. Ecco un esempio di quello che propongo:

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") 
} 

Qui troverete un esempio più complesso: Scala Best Practices: Trait Inheritance vs Enumeration