【问题标题】:How can I get every object belonging to a hierarchy of classes that include certain attribute?如何获取属于包含某些属性的类层次结构的每个对象?
【发布时间】: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


【解决方案1】:

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

例子:

trait Animal {
  val hasFur: Boolean = false

  def name: String
}

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

【讨论】:

    猜你喜欢
    • 2020-04-23
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 2016-02-15
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多