Я борюсь с тем, как я мог бы избежать использования 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()
?