je serais sérieusement considérer si cela est la conception la plus appropriée dans ce contexte. Êtes-vous sûr que l'interface IMachine
ne devrait pas avoir une méthode Process
? Chaque machine pourrait mettre en œuvre ce, le cas échéant, et la boucle devient juste:
foreach (IMachine machine in machines)
{
machine.Process();
}
Quoi qu'il en soit, pour répondre à la question posée, voici une façon de le faire. L'idée est de continuer à essayer un "casting spéculatif" à un type de cible jusqu'à ce qu'il réussisse ou que nous ne soyons plus à court d'options. Ceci est normalement effectué avec l'opérateur as
, suivi d'un null
-test.
IList<IMachine> machines = ...
foreach (IMachine machine in machines)
{
MachineLine machineLine = machine as MachineLine;
if (machineLine != null)
ProcessLine(machineLine);
else
{
MachineCircle machineCircle = machine as MachineCircle;
if (machineCircle != null)
ProcessCircle(machineCircle);
else throw new UnknownMachineException(...);
}
}
Comme vous pouvez le voir, ce modèle est moche. Pour une solution plus propre, vous pouvez également jeter un oeil à C# - Is there a better alternative than this to 'switch on type' s'il y a un grand nombre d'implémenteurs.
wow! presque le même code :) – Lorenzo
@Lorenzo: J'ai aussi écrit 'instanceof' au début mais c'est en fait' is'. Peut-être que vous voulez corriger votre code aussi :) – BoltClock
+1 vous avez absolument raison! ;) – Lorenzo