Предположим, у меня есть такая иерархия:
![enter image description here](https://i.stack.imgur.com/rqJjL.png)
И это мой код:
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}
, но мне нужна новая черта для каждой новой характеристики в любом классе животных (плавники, лапки и т. д.).
Эта модель должна расширяться, поэтому я мог бы добавить много новых животных и функций в будущем.Я также должен сохранить эту иерархию, потому что я мог бы хотеть перечислить каждого Млекопитающего или каждую Птицу.Также я не могу просто добавить «клюв» как особенность птиц, потому что у утконоса также есть клювы.