2010-03-24 12 views
28

Autant que je sache, Scala a des définitions pour la classe de valeur d'énumération pour Value (Int), Value (String) et Value (Int, String).Surcharge Scala Énumération Valeur

Quelqu'un connaît-il un exemple de création d'une nouvelle sous-classe Value pour prendre en charge un constructeur différent? Par exemple, si je veux créer une énumération avec des objets Value (Int, String, String), comment le ferais-je? Je voudrais tous les autres avantages de l'utilisation de la classe Enumeration.

Merci.

Répondre

40

Les valeurs d'énumération sont des instances de la classe Val. Cette classe peut être étendue et une méthode d'usine peut être ajoutée.

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! Fonctionne exactement comme je le voulais. Merci. – Ralph

+0

@ Thomas Jung: Votre idée est brillante, mais je ne pouvais pas l'utiliser. Il y avait un avertissement "importé' Mon 'est définitivement caché par la définition de l'objet dans le paquet " Enfin, j'ai ajouté cette ligne: tapez Mon = Valeur à cet exemple et cela a fonctionné. Je ne comprends toujours pas pourquoi, Pourriez-vous s'il vous plaît expliquer? –

+0

Pour utiliser l'énumération 'My', vous devez d'abord l'importer avec' import My._' et ajouter le code suivant dans l'objet 'My':' type My = MyVal', afin que vous puissiez accéder au x val. – metch

1

En fait, dans Scala Enumeration a une signification beaucoup plus simple que dans Java. Pour cela, vous n'avez pas besoin de sous-classer Enumeration ni sa valeur, vous avez juste besoin d'instancier votre propre type dans son objet compagnon en tant que val. De cette façon, vous obtiendrez le modèle d'accès familier de val value:MyEnum = MyEnum.Value comme vous l'avez fait en Java, ce qui n'est pas possible dans l'exemple fourni par Thomas Jung. Là, vous aurez def value:My.MyVal = MyEnum.Value ce qui est un peu déroutant car il me semble en outre tout le caractère hackeux de la solution. Voici un exemple de ce que je propose:

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

Vous trouverez ici un exemple plus compliqué: Scala Best Practices: Trait Inheritance vs Enumeration