Я бы серьезно рассмотреть, если это является наиболее подходящим дизайн в этом контексте. Вы уверены, что интерфейс IMachine
не должен иметь метод Process
? Каждая машина может осуществить это по мере необходимости, а затем цикл просто становится:
foreach (IMachine machine in machines)
{
machine.Process();
}
Во всяком случае, чтобы ответить на вопрос, как просили, вот один из способов сделать это. Идея состоит в том, чтобы продолжать попытки «спекулятивного приведения» к целевому типу, пока это не удастся, или у нас нет вариантов. Обычно это делается с помощью оператора as
, а затем null
.
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(...);
}
}
Как вы можете видеть, этот рисунок уродливый. Для более чистого решения вы также можете взглянуть на C# - Is there a better alternative than this to 'switch on type', если существует большое количество исполнителей.
вау! почти тот же код :) – Lorenzo 2010-12-05 23:01:50
@Lorenzo: Я сначала написал `instanceof`, но на самом деле` is`. Мог бы исправить ваш код тоже :) – BoltClock 2010-12-05 23:02:24
+1 ты абсолютно прав! ;) – Lorenzo 2010-12-05 23:04:57