2012-01-22 3 views
1

Можно ли объявить объект и класс Enumeration на том же уровне в Scala?Определить объект и класс значений Enumeration на том же уровне

Я начал с этого, но я не уверен, что является лучшим способом регистрации экземпляров.

object Gender extends Enumeration { 
    val MALE = new Gender(0) 
    val FEMALE = new Gender(1) 
} 

class Gender(val id: Int) extends Gender.Value { 

} 

Мотивацией для этого является то, что я не хочу, чтобы обратиться к классу перечислений в Gender.Gender, но Пол.

+0

Не является ли объект экземпляром класса, поэтому вы не можете применить к нему «новый»? –

+0

Да, но новый Пол относится к классу, а не к объекту, этот код компилируется и константы перечисления будут доступны, но перечисление не будет знать о них –

ответ

3

Это работает:

object Gender extends Enumeration { 
    val male = new Gender 
    val female = new Gender 

    class Sneaky extends Val(nextId, null) 
} 

class Gender extends Gender.Sneaky 

> println(Gender.values) 
Gender.ValueSet(male, female) 

Однако я не чувствую себя хорошо об этом. Я думаю, что было бы лучше, либо сделать псевдоним типа (если вы можете в этой области):

object Gender extends Enumeration { 
    ... 
} 

type Gender = Gender.Value 

Или import того типа, прежде чем использовать его:

object Gender extends Enumeration { 
    val male, female = Value 

    type Gender = Value 
} 

import Gender._ 
val x: Value = male 

(Или, если вы может, использовать классы классов).

+0

спасибо за предложения. Использование псевдонимов типов или импорт не является вариантом в этом случае. –

Смежные вопросы