Предположим, у меня есть иерархия классов в Java:
interface Item { ... };
class MusicBox implements Item { ... };
class TypeWriter implements Item { ... };
class SoccerBall implements Item { ... };
, и у меня есть другой класс в том же пакете:
class SpecialItemProcessor {
public void add(Item item)
{
/* X */
}
}
, где я хочу сделать что-то другое для каждого элементатипа, но я не хочу определять это действие в различных Item
классах (MusicBox
, TypeWriter
, SoccerBall
).
Один из способов справиться с этим:
class SpecialItemProcessor {
public void add(Item item)
{
if (item instanceof MusicBox)
{
MusicBox musicbox = (MusicBox)item;
... do something ...
}
else if (item instanceof MusicBox)
{
TypeWriter typewriter = (TypeWriter)item;
... do something ...
}
else if (item instanceof SoccerBall)
{
SoccerBall soccerball = (SoccerBall)item;
... do something ...
}
else
{
... do something by default ...
}
}
}
Это работает, но кажется неуклюжим. Есть ли лучший способ сделать это, когда я знаю об особых случаях? (очевидно, если Item
содержит метод doSomethingSpecial
, тогда я могу просто вызвать метод этого элемента, не заботясь о его типе, ноесли я не хочу, чтобы это различие происходило внутри самого предмета, как мне с ним бороться?)