2010-03-24 133 views
28

据我所知,Scala为Value(Int),Value(String)和Value(Int,String)的Enumeration Value类定义。覆盖Scala枚举值

有谁知道创建一个新的Value子类来支持不同的构造函数的例子吗?

例如,如果我想创建一个带有值(Int,String,String)对象的Enumeration,我该怎么做?我希望使用Enumeration类的所有其他好处。

谢谢。

回答

40

Enumeration值是Val类的实例。这个类可以扩展,并且可以添加工厂方法。

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

好极了!完全像我想要的那样工作。谢谢。 – Ralph 2010-03-24 14:54:02

+0

@Thomas Jung:你的想法很棒,但我无法使用它。有一个警告“导入”我的“永久隐藏在包中的对象的定义” 最后,我添加了这一行: 类型我的=值 到这个例子,它的工作。我还是不明白为什么, 你能解释一下吗? – 2014-03-19 08:10:18

+0

要使用'My'枚举,您必须首先使用'import My._'导入它,并在'My'对象中添加以下代码:'type My = MyVal',以便访问x val。 – metch 2014-03-25 09:02:56

1

实际上,在Scala中枚举比在Java中有更简单的含义。出于您的目的,您无需以任何方式对枚举或其值进行子类化,只需将其自己的类型实例化为其伴侣对象即val即可。通过这种方式,您将获得熟悉的访问模式val value:MyEnum = MyEnum.Value,就像您在Java中所做的那样,这在托马斯荣格提供的示例中是不可能的。你会有def value:My.MyVal = MyEnum.Value这是有点混乱,因为在我看来,除了解决方案的所有hackiness。这里是什么,我提出了一个例子:

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

在这里你可以找到一个更复杂的例子:Scala Best Practices: Trait Inheritance vs Enumeration