一部のコードで 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) 動物が食べる餌の種類に基づいて、3 つの動物のコレクションを動物園に保管できますが、instanceOf()
どのコレクションに餌を与えるかを確認するために、餌の種類をテストするために使用する必要があります。少なくとも、食べない動物に食べ物を与えないので、これはより効率的です。
私はいくつかの他のアプローチを考えましたが、繰り返しになりますが、それらは単に責任をinstanceof()
負っているようです.
助言がありますか?それとも、これ (少なくとも 2 つ) の許容可能な使用法instanceof()
でしょうか?