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
) で定義したくありません。
これを処理する 1 つの方法は次のとおりです。
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
、そのアイテムのタイプを気にせずにそのアイテムのメソッドを呼び出すことができますが、アイテム自体の中でその差別化を行いたくない場合は、どうすれば対処できますか?)