2011-07-15 18 views
6

Scalaで既存の列挙型を拡張できるかどうかは疑問です。たとえば: Scalaで既存の列挙型オブジェクトを拡張するには?

object BasicAnimal extends Enumeration{ 
    type BasicAnimal = Value 
    val Cat, Dog = Value 
} 

が、これはこのような何かを拡張することができます:

object FourLeggedAnimal extends BasicAnimal{ 
    type FourLeggedAnimal = Value 
    val Dragon = Value 
} 

その後、FourLeggedAnimal内の要素は猫、犬とドラゴンだろう。これはできますか?

答えて

3

いいえ、できません。 の後の識別子BasicAnimalはタイプではありません。値であるため、残念ながら動作しません。

+0

ああ、私の方法のエラーを参照してください。私は新しい応答を追加したので、コードを正しく書くことができます。 – Henry

+0

評判のため投稿できません。基本的には、オブジェクトを抽象クラスとして定義して拡張し、対応するクラスを直接拡張するオブジェクトをインスタンス化することができます。 – Henry

+0

コードは次のとおりです。http://codepaste.net/24vfhv 申し訳ありません。 – Henry

1

があってもよいことは、方法です:

object E1 extends Enumeration { 
    type E1 = Value 
    val A, B, C = Value 
} 
class ExtEnum(srcEnum: Enumeration) extends Enumeration { 
    srcEnum.values.foreach(v => Value(v.id, v.toString)) 
} 
object E2 extends ExtEnum(E1) { 
    type E2 = Value 
    val D, E = Value 
} 
println(E2.values) // prints > E2.ValueSet(A, B, C, D, E) 

一つの発言:好き

E2.A // Can not resolve symbol A 

しかし、あなたはそれらを呼び出すことができます:

E2(0) // A 
それは名前でE2からE1値を使用することはできません

または:

E2.withName(E1.A.toString) // A 
+0

私はこのアイデアが好きです。合計はEnumの静的な型です。繰り返しても問題はありません。唯一の複雑なことは、IDをデータベースに保存する必要がある場合、回避する範囲を定義する必要があります。混乱を招く... –

関連する問題