为多个枚举对象创建父类型

时间:2015-07-10 05:44:29

标签: scala enumeration traits

我想创建多个Enumeration对象,所有这些对象都从一个父对象继承。我希望它们从一个父级继承的原因是我想从对象创建一个Enumerations集合并将它们分组在该类型下。

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 )
}

我如何实现这一目标?

2 个答案:

答案 0 :(得分: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 )
  }

当然,您需要创建自己的值类型和自己的工厂方法来生成新类型,而不是Enumeration附带的默认类型。

答案 1 :(得分: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 )
}