据我所知,Scala为Value(Int),Value(String)和Value(Int,String)的Enumeration Value类定义。覆盖Scala枚举值
有谁知道创建一个新的Value子类来支持不同的构造函数的例子吗?
例如,如果我想创建一个带有值(Int,String,String)对象的Enumeration,我该怎么做?我希望使用Enumeration类的所有其他好处。
谢谢。
据我所知,Scala为Value(Int),Value(String)和Value(Int,String)的Enumeration Value类定义。覆盖Scala枚举值
有谁知道创建一个新的Value子类来支持不同的构造函数的例子吗?
例如,如果我想创建一个带有值(Int,String,String)对象的Enumeration,我该怎么做?我希望使用Enumeration类的所有其他好处。
谢谢。
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
实际上,在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
好极了!完全像我想要的那样工作。谢谢。 – Ralph 2010-03-24 14:54:02
@Thomas Jung:你的想法很棒,但我无法使用它。有一个警告“导入”我的“永久隐藏在包中的对象的定义” 最后,我添加了这一行: 类型我的=值 到这个例子,它的工作。我还是不明白为什么, 你能解释一下吗? – 2014-03-19 08:10:18
要使用'My'枚举,您必须首先使用'import My._'导入它,并在'My'对象中添加以下代码:'type My = MyVal',以便访问x val。 – metch 2014-03-25 09:02:56