如何获得属于包含某些属性的类层次结构的每个对象?

时间:2018-10-02 13:57:46

标签: scala reflection class-hierarchy

假设我具有这样的层次结构:

enter image description here

这是我的代码:

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}

但是对于任何动物类别(鳍,爪等)的每个新特征,我都需要一个新特征。

此模型应该升级,因此将来我可能会添加许多新的动物和功能。 我还需要保持这种层次结构,因为我可能想列出每个哺乳动物或每个鸟。另外,我不能简单地将“喙”添加为鸟类的特征,因为鸭嘴兽也有喙。

1 个答案:

答案 0 :(得分:0)

可能您需要创建trait AnimalWithFur,但是如果您有一些有关动物的一般信息(因此很多动物都有毛皮),或者只有要过滤的字段,则可以添加例如具有默认返回值hasFur的方法false,并在需要true和过滤器集合或将其添加为选项字段和相同解决方案时,在需要的地方覆盖它。

示例:

trait Animal {
  val hasFur: Boolean = false

  def name: String
}

但是在这种情况下,每只动物都会拥有这个领域,所以我不知道这种解决方案对您有好处。