我想创建多个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 )
}
我如何实现这一目标?
答案 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 )
}