【发布时间】:2018-10-02 13:57:46
【问题描述】:
假设我有这样的层次结构:
这是我的代码:
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}
但是对于任何动物类别(鳍、爪子等)中的每个新特征,我都需要一个新特征。
这个模型应该会升级,因此我将来可能会添加许多新的动物和功能。 我还需要保持这种层次结构,因为我可能想列出每一个哺乳动物或每一个鸟。此外,我不能简单地将“喙”添加为鸟类的特征,因为鸭嘴兽也有喙。
【问题讨论】:
-
如果您希望在编译时对其进行验证,我认为您必须创建
AnimalWithFur特征。如果没有,您可以在Animal中定义一个布尔值hasFur,具体动物必须实现它。在我的书中,将反射用于如此简单的任务是一个很大的禁忌。
标签: scala reflection class-hierarchy