web-dev-qa-db-ja.com

オーバーライドScala列挙値

私の知る限り、Scalaには、Value(Int)、Value(String)、およびValue(Int、String)の列挙値クラスの定義があります。

別のコンストラクターをサポートするために新しいValueサブクラスを作成する例を知っている人はいますか?

たとえば、Value(Int、String、String)オブジェクトを使用して列挙型を作成する場合、どのようにすればよいですか? Enumerationクラスを使用する他のすべての利点が欲しいです。

ありがとう。

31
Ralph

列挙値は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
44
Thomas Jung

実際、Scala列挙型は、Javaよりもはるかに単純な意味を持っています。目的のために、列挙型やその値をサブクラス化する必要はありません。独自の型をインスタンス化するだけです。 valとしてのコンパニオンオブジェクト。このようにして、Javaで提供された例では不可能な、val value:MyEnum = MyEnum.Valueの使い慣れたアクセスモデルを取得します。 ThomasJung。そこにはdef value:My.MyVal = MyEnum.Valueがありますが、これは、ソリューションのすべてのハック性に加えて、私にはちょっと混乱しているようです。これが私が提案するものの例です。

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のベストプラクティス:特性の継承と列挙

1
Nikita Volkov

もう1つの簡単なアプローチは次のとおりです。

scala> :paste
// Entering paste mode (ctrl-D to finish)

object Colors extends Enumeration {
  sealed case class Color private[Colors](hexCode: String, name: String) extends Val(name)

  val Black = Color("#000000", "black")
  val White = Color("#FFFFFF", "white")
}

// Exiting paste mode, now interpreting.

defined object Colors

scala> Colors.Black.hexCode
res0: String = #000000

scala> Colors.Black.name
res1: String = black

scala> Colors.values
res2: Colors.ValueSet = Colors.ValueSet(black, white)

scala> 
0
James

Enumeration.Valクラスを拡張して実行したいと思います。

あなたの要件のために、私は以下のサンプルを投稿します:

object FileType extends Enumeration {
  val csv = Val(1,"csv", ",")
  val tsv = Val(2,"tsv", "\t")
  protected case class Val(num: Int, fileType: String, delimiter: String) extends super.Val
  implicit def valueToFileType(x: Value): Val = x.asInstanceOf[Val]
}

値へのアクセスは次のとおりです。

scala> FileType.csv
res0: FileType.Val = csv

scala> FileType.csv.delimiter
res29: String = ,
0
apnith