为多个枚举对象创建父类型
Creating a parent type to multiple enumeration objects
我想创建多个枚举对象,所有对象都继承自一个父对象。我希望它们从一个父级继承的原因是我想从对象创建一个枚举集合并将它们分组在该类型下。
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 )
}
我该如何实现这一目标?
嗯,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 附带的默认类型。
我不知道可以使用 #
引用特征成员类型。以下作品:
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 )
}
我想创建多个枚举对象,所有对象都继承自一个父对象。我希望它们从一个父级继承的原因是我想从对象创建一个枚举集合并将它们分组在该类型下。
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 )
}
我该如何实现这一目标?
嗯,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 附带的默认类型。
我不知道可以使用 #
引用特征成员类型。以下作品:
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 )
}