假设我具有这样的层次结构:
这是我的代码:
trait Animal {
def name: String
}
trait Reptile extends Animal
trait Bird extends Animal
trait Mammal extends Animal
case class Snake(name: String) extends Reptile
case class Parrot(name: String, beak: String, wings: String) extends Bird
case class Platypus(name: String, beak: String, fur: String) extends Mammal
case class Cat(name: String, fur: String) extends Mammal
问题是:如何从具有特定属性的动物列表中获取每只动物? 例如,我可能想在列表中获取所有带有毛皮的动物实例。我想我可以使用反射来遍历类的层次结构,但是我想避免这种情况。另一种可能性是添加特征“ AnimalWithFur”,然后每只有毛皮的动物都必须对其进行扩展。如果我有 Seq [Animal]动物,我可以这样做:
val animalsWithFur:Seq[AnimalWithFur] = animals.collect{case a: AnimalWithFur => a}
但是对于任何动物类别(鳍,爪等)的每个新特征,我都需要一个新特征。
此模型应该升级,因此将来我可能会添加许多新的动物和功能。 我还需要保持这种层次结构,因为我可能想列出每个哺乳动物或每个鸟。另外,我不能简单地将“喙”添加为鸟类的特征,因为鸭嘴兽也有喙。
答案 0 :(得分:0)
可能您需要创建trait AnimalWithFur
,但是如果您有一些有关动物的一般信息(因此很多动物都有毛皮),或者只有要过滤的字段,则可以添加例如具有默认返回值hasFur
的方法false
,并在需要true
和过滤器集合或将其添加为选项字段和相同解决方案时,在需要的地方覆盖它。
示例:
trait Animal {
val hasFur: Boolean = false
def name: String
}
但是在这种情况下,每只动物都会拥有这个领域,所以我不知道这种解决方案对您有好处。