我正在使用“案例类而不是枚举”模式,并且想要列出每个“枚举”的所有值以及一些方法。所以我决定不仅仅从一个密封的抽象类派生我的案例类,而是从一个叫做Lookup的超类派生所有密封的抽象类,并定义一个从中派生抽象类的伴随对象的LookupTrait。如何制作一个可以实例化类的参数化特征?
abstract class Lookup {
val name: String
override def toString = name
}
trait LookupTrait[T<:Lookup] {
val all: Map[String, T]
val default: T
def withName(name: String): T =
if(all.contains(name)) all(name)
else default
}
和示例查询看起来是这样的:
sealed case class StudyGoal(override val name: String) extends Lookup
object StudyGoal extends LookupTrait[StudyGoal] {
override val all = Map(
"present new evaluation method" -> StudyGoal("present new evaluation method"),
"evaluate existing product" -> StudyGoal("evaluate existing product"),
"develop new theoretical model" -> StudyGoal("develop new theoretical model"),
"unknown" -> StudyGoal("unknown")
)
override val default = StudyGoal("unknown")
}
我宁愿只是在每个查询的同伴对象定义字符串列表,并有特质实例的情况下类。但是,当我在Scala中发现三种不同的反射方式时 - 使用Manifest,TypeTag,并按照in the documentation所述获得类的构造函数,它们都似乎需要有一个类的实例存在,让他们在参数化的LookupTrait特征中工作。
我想有这样的:
abstract class Lookup {
val name: String
override def toString = name
}
trait LookupTrait[T<:Lookup] {
val allNames: List[String]
val default: T = //Instantiate a T using the string "unknown".
//It is OK that this string will be the same for all Lookups.
val all: Map[String, T] = allNames.map(
n => n -> //instantiate a T here, using n as the parameter
) += default
def withName(name: String): T =
if(all.contains(name)) all(name)
else default
}
sealed case class StudyGoal(override val name: String) extends Lookup
object StudyGoal extends LookupTrait[StudyGoal] {
override val allNames = List(
"present new evaluation method"),
"evaluate existing product",
"develop new theoretical model"
)
}