Как я могу получить каждый объект, принадлежащий иерархии классов, которые включают определенный атрибут? - PullRequest
0 голосов
/ 02 октября 2018

Предположим, у меня есть такая иерархия:

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 голосов
/ 02 октября 2018

Возможно, вам нужно создать trait AnimalWithFur, но если у вас есть некоторая общая информация о животных (так что у многих животных есть мех) или только поля, которые вы хотите отфильтровать, вы можете добавить, например, метод hasFur с возвращаемым значением по умолчанию false и переопределяйте его в тех местах, когда вам нужно иметь true и фильтровать коллекцию или добавить его в качестве поля опции и того же решения.

Пример:

trait Animal {
  val hasFur: Boolean = false

  def name: String
}

Но в этомна случай, если у каждого животного будет это поле, поэтому я не знаю, подходит ли вам это решение.

...