Я борюсь с тем, как я мог бы избежать использования instanceof() в некоторых моих кодах. Этот надуманный пример несколько отражает проблему.
Class Meat extends Food;
Class Plant extends Food;
Class Animal;
Class Herbivore extends Animal
{
void eat( Plant food);
}
Class Carnivore extends Animal
{
void eat( Meat food);
}
Class Omnivore extends Animal
{
void eat(Food food);
}
Class Zoo
{
List<Animals> animals;
void receiveFood( Food food)
{
// only feed Plants to Herbivores and Meat to Carnivores
// feed either to Omnivores
}
}
Травоядные животные интересуются только растениями, плотоядными животными только в мясе и омниверсе. Когда зоопарк получает Пищу, имеет смысл попытаться накормить пищу для животных, которые едят этот тип пищи.
Я думал о нескольких решениях, но все, кажется, зависит от использования instanceof() где-то, и мои различные рефакторинги просто перемещают его.
(1) Я мог реализовать eat( Food food) в Animal, и каждый подкласс мог выбрать игнорировать пищу, которую она не ест, но это неэффективно и потребует, чтобы каждый подкласс Animal использовал instanceof() для проверки типа пищи.
(2) Я мог бы хранить три коллекции животных в Зоопарке в зависимости от типа пищи, которую они едят, но все равно придется использовать instanceof(), чтобы проверить тип пищи, чтобы увидеть, какую коллекцию нужно кормить. По крайней мере, это было бы более эффективно, так как я не буду кормить животных животными, которые не будут есть.
Я думал о некоторых других подходах, но опять же, они просто передают instanceof() доллар.
Любые предложения? Или это (2, по крайней мере) было бы приемлемым использованием instanceof()?