Supposons que j'ai une hiérarchie de classes en Java:modèle de conception de répartition?
interface Item { ... };
class MusicBox implements Item { ... };
class TypeWriter implements Item { ... };
class SoccerBall implements Item { ... };
et j'ai une autre classe dans le même package:
class SpecialItemProcessor {
public void add(Item item)
{
/* X */
}
}
où je veux faire quelque chose de différent pour chaque type d'élément, mais je ne ne veulent pas définir cette action dans les différentes classes Item
(MusicBox
, TypeWriter
, SoccerBall
).
Une façon de gérer est:
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 ...
}
}
}
Cela fonctionne, mais il semble vraiment maladroit. Y a-t-il une meilleure façon de faire cela, quand je connais des cas spéciaux? (évidemment si Item
contient une méthode doSomethingSpecial
alors je peux simplement appeler la méthode de cet article sans se soucier de quel type il est, mais si je ne veux pas que cette différenciation se produise dans l'article lui-même, comment traiter?)
Pas une réponse Je sais, mais dans ActionScript 3 apparemment, vous pouvez instancier une classe à partir d'une chaîne (ie, 'com.djw.MusicBox' peut instancier un MusicBox), est ce genre de chose possible en Java peut-être? Juste une suggestion! – danjah
@dan: 'Classe # forName()'. Je doute cependant de la valeur ici. – BalusC