2011-07-15 29 views
6

Scala'daki mevcut numaralandırmalarınızı genişletip genişletemeyeceğinizi merak ediyorum. Örneğin: Scala'daki mevcut numaralandırma nesnelerini nasıl genişletirim?

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

bu böyle bir şey uzatılabilir Can:

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

Sonra FourLeggedAnimal içinde elementler Kedi, Köpek ve Ejderha olurdu. Bu yapılabilir mi?

cevap

3

Hayır, bunu yapamazsınız. extends'dan sonra BasicAnimal tanımlayıcısı bir tür değil, bir değer, bu nedenle ne yazık ki çalışmayacak.

+0

Oh, yollarımın hatasını gördüm. Yeni bir yanıt ekledim, bu yüzden kodu düzgün yazabilirim. – Henry

+0

İtibar nedeniyle yayınlamama izin vermiyor. Temel olarak, nesneleri soyut sınıflar olarak tanımlayabilir ve bunları genişletebilir, ardından ilgili sınıfları doğrudan genişleten nesneleri başlatabilirsiniz. – Henry

+0

İşte kod: http://codepaste.net/24vfhv Spam için özür dilerim. – Henry

1

etsin bu şekilde açıklanmıştır:

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) 

Bir söylemek: mi

E2.A // Can not resolve symbol A 

Ama onları çağırabilir:

E2(0) // A 
ada göre E2 den E1 değerleri kullanmak mümkün değildir

veya:

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

Bu fikri beğendim, toplam Enum için statik tipler, onları tekrarlamanızın bir önemi yok, veritabanına kaydetmek için ID'yi kullanmanız gerekiyorsa tek karmaşık şey olurdu, kaçınmak için aralıkları tanımlamanız gerekir karışıklık yaratıyor ... –