在我正在从事的项目中,有一些代码基本上如下:
sealed trait Character {
def tags: Seq[String]
def life: Int
// other defs
}
object Character {
def addTag[T <: Character](character: T,tag: String): T = {
val newTags = character.tags :+ tag
// character.copy(tags = newTags) // this doesn't compile
character match {
case c: Person => c.copy(tags = newTags).asInstanceOf[T]
case c: Beast => c.copy(tags = newTags).asInstanceOf[T]
// ten more cases to match each subclass
......
case _ => character
}
}
}
case class Person(title: String,firstName: String,lastName: String,tags: Seq[String],life: Int,weapon: String
) extends Character
case class Beast(name: String,weight: Int
) extends Character
// ten other case classes that extends Character
......
代码可以工作,但是addTag
方法看起来并不漂亮,原因有两个:首先,它使用asInstanceOf
;其次,它有许多case c: ......
行,每行几乎都是相同的。
有没有办法使代码更好?