Предположим, у меня есть иерархия классов в 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
).
Один из способов справиться с этим is:
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 ...
}
}
}
Это работает, но кажется действительно неуклюжим. Есть ли лучший способ сделать это, если мне известны особые случаи? (очевидно, если Элемент
содержит метод doSomethingSpecial
, то я могу просто вызвать метод этого элемента не заботясь о том, что это за тип, но если я не буду Я не хочу, чтобы эта дифференциация происходила внутри самого элемента, как мне с этим справиться?)