2010-03-24 119 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