2015-07-10 3 views
1

Я хочу создать несколько объектов Enumeration, все наследующие от одного родителя. Причина, по которой я хочу, чтобы они наследовались от одного родителя, заключается в том, что я хочу создать коллекцию перечислений из объектов и сгруппировать их под этим типом.Создание родительского типа для нескольких объектов перечисления

object Searchable{ 
    trait SearchFlags{ 
    self: Enumeration => 
     type Value = self.Value 
    } 
} 

object SearchableByLocation{ 
    object SearchFlags extends Enumeration{ 
     val Flag1 = Value 
    } 
} 

object SearchableByAge{ 
    object SearchFlags extends Enumeration{ 
     val Flag1 = Value 
    } 
} 

object Test extends App{ 
    //I cannot refer to members of a trait directly, so the 
    //underlying type of Set is invalid 
    val flags: Set[ Searchable.SearchFlags.Value ] = Set(SearchableByLocation.SearchFlags.Flag1, SearchableByAge.SearchFlags.Flag1) 
} 

Как я могу добиться этого?

ответ

0

Я не знал, что типы элементов-черт можно называть с помощью #. Следующие работы:

object Searchable{ 
    trait SearchFlags extends Enumeration 
} 

object SearchableByLocation{ 
    object SearchFlags extends Searchable.SearchFlags{ 
    val Flag1 = Value 
    } 
} 

object SearchableByAge{ 
    object SearchFlags extends Searchable.SearchFlags{ 
    val Flag1 = Value 
    } 
} 

object Test extends App{ 
    val flags: Set[ Searchable.SearchFlags#Value ] = Set(SearchableByLocation.SearchFlags.Flag1, SearchableByAge.SearchFlags.Flag1) 
} 
+0

Возможно, это не то, что вы хотите. Вызывая одну и ту же функцию Value для обеих перечислений, вы делаете все экземпляры обоих перечислений полностью совместимыми. Это позволит вам передать значение SearchableByAge методу, ожидающему значения SearchableByLocation. Оба типа имеют тип Searchable.SearchFlags # Value. Это громоздкий способ создать единый enum ;-) –

+0

@ DanielL. Спасибо за ваш вклад, но я не уверен, что понял, что вы пытаетесь сказать. Метод значения в 'val Flag1 = Value' возвращает значение соответствующих типов' Value'. Проверьте это: http://sprunge.us/iTPM Также удален оставшийся комментарий из моего ответа. – 0fnt

+0

Интересно! Мне любопытно, что вы получаете экземпляры одного и того же значения Searchable.SearchFlags # Value, которые в одно и то же время различного типа, но реализация Enumeration довольно запутанна, так справедлива, если она работает для вас ;-) –

1

Ну, объекты перечисления Scala - это не что иное, как серия значений общего типа. Вам нужно создать общую черту, а затем гарантировать, что константы этого типа. Это работает:

trait CommonBase 

    object Enum1 extends Enumeration 
    { 
    protected class Enum1Val extends Val with CommonBase 
    protected final def enum1Value() = new Enum1Val() 

    val A, B, C = enum1Value() 
    } 

    object Enum2 extends Enumeration 
    { 
    protected class Enum2Val extends Val with CommonBase 
    protected final def enum2Value() = new Enum2Val() 

    val D, E, F = enum2Value() 
    } 

    def main(args: Array[String]): Unit = { 
    val flags: Set[ CommonBase ] = Set(Enum1.A, Enum2.D) 
    } 

Конечно, вам нужно создать свой собственный тип значения и собственный фабричный метод для получения вашего нового типа вместо типа по умолчанию, который поставляется с Перечисления.

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