我正在努力避免在我的一些代码中使用 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()
吗?