извините за длинный вопрос:
Скажем, у меня есть список животных, и я хочу разделить их так:
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
}
К сожалению, это не сработает. Собака из Плотоядного отличается от Собаки в BasicAnimal. То есть Carnivore.Dog == BasicAnimal.Dog возвращает false, поэтому единственный способ повторно использовать код из BasicHouse в Den - использовать довольно хакерский метод равенства, который сравнивает строки перечислений (или что-то подобное). Это работает, но это очень нечисто. Можете ли вы увидеть какие-либо другие возможности?