我在努力想方设法避免在我的代码中使用 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) 我可以在 Animal 中实现 eat( Food food)
,每个子类都可以选择忽略它不吃的食物,但这样效率低下,每个 Animal 子类都需要使用 instanceof()
来测试食物的类型。
(2) 我可以根据它们所吃食物的类型在动物园中保留三个动物集合,但仍然需要使用 instanceOf()
来测试食物的类型,以查看要将其喂给哪个集合。至少这样会更有效率,因为我不会将食物喂给不吃它的动物。
我想到了其他一些方法,但它们似乎只是将 instanceof()
传递给别的地方。
有什么建议吗?或者(至少)这种使用 instanceof()
的方法可行吗?