2010-03-24 10 views
28

Por lo que puedo decir, Scala tiene definiciones para la clase de Valor de enumeración para Valor (Int), Valor (Cadena) y Valor (Int, Cadena).Reemplazando el valor de enumeración de Scala

¿Alguien conoce un ejemplo para crear una nueva subclase de valor para admitir un constructor diferente?

Por ejemplo, si quiero crear un objeto Enumeración con valor (Int, String, String), ¿cómo lo haría? Me gustaría todos los otros beneficios de usar la clase Enumeration.

Gracias.

Respuesta

40

Los valores de Enumeration son instancia de la clase Val. Esta clase se puede extender y se puede agregar un método de fábrica.

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

Excelente! Funciona exactamente como yo quería. Gracias. – Ralph

+0

@Thomas Jung: Tu idea es brillante, pero no pude usarla. Hubo una advertencia "importado 'Mi' está permanentemente oculto por definición de objeto en el paquete" Finalmente, agregué esta línea: escriba My = Value en este ejemplo y funcionó. Todavía no entiendo por qué, ¿Podría explicarlo? –

+0

Para usar la enumeración 'Mi', primero debe importarla con' import My._' y también agregar el siguiente código en el objeto 'My':' type My = MyVal', para que pueda acceder al valor x val. – metch

1

Actualmente en Scala Enumeración tiene un significado mucho más simple que en Java. Para su propósito, no tiene que subclasificar la enumeración ni su valor de ninguna manera, solo necesita crear una instancia de su propio tipo en su objeto complementario como val. De esta forma obtendrá el modelo de acceso familiar de val value:MyEnum = MyEnum.Value que tenía en Java, que no es posible en el ejemplo proporcionado por Thomas Jung. Allí tendrá def value:My.MyVal = MyEnum.Value, lo cual es un tanto confuso, ya que me parece además de todo el alboroto de la solución. He aquí un ejemplo de lo que 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") 
} 

Aquí encontrará un ejemplo más complicado: Scala Best Practices: Trait Inheritance vs Enumeration

Cuestiones relacionadas