Организация перечислений в Scala

Извините за долговечный вопрос:

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

BasicAnimal = {Cat, Dog}
Carnivore = {Cat, Dog, Dragon}
Herbivore = {Cat, Dog, Horse}

сейчас, эти Животные также должны жить где-то. Так что есть

BasicShelter with a method shelter(animal: BasicAnimal)
Den with a method shelter(animal: Carnivore)
Shed with a method shelter(animal: Herbivore)

Какой лучший способ реализовать это в Scala? Одна попытка была:

class BasicAnimal extends Enumeration{
   val Cat, Dog = Value
}
class Carnivore extends BasicAnimal{
   val Dragon = Value
}
class Herbivore extends BasicAnimal{
   val Horse = Value
}

, а затем

class BasicHouse{
  def shelter(animal: BasicAnimal) = {//lots of code}
}
class Den{
  def shelter(animal: Carnivore) = {
  //again lots of code, but the cases dealing with Cat and Dog can be relegated to super.shelter
  }
}
class Shed{
  //the same
}

К сожалению, это не будет работать. Собака из плотки отличается от собаки в базамимале. Это carnivore.dog == basicanimal.dog возвращает false, так что единственный способ повторно использовать код из базишоуса в лося, имея довольно хакивый метод равенства, который сравнивает строки врач (или что-то подобное). Работает, но это очень нечисто. Можете ли вы увидеть любые другие возможности?

9
задан Henry Henrinson 8 September 2011 в 12:29
поделиться