Как избежать операторов переключения регистров в C#, где каждый случай имеет разные зависимости?C#

Место общения программистов C#
Ответить
Anonymous
 Как избежать операторов переключения регистров в C#, где каждый случай имеет разные зависимости?

Сообщение Anonymous »

Я работаю с кем-то над небольшим хобби-проектом в качестве учебного упражнения. В нем пользователь путешествует по подземелью, находит сокровища, сражается с монстрами и т. д. и т. п.
Сейчас подход выглядит примерно так (псевдокод):

Код: Выделить всё

public class DungeonRunner
{
public ICombatEngine CombatEngine;
public ITreasureEngine TreasureEngine;
public ITrapEngine TrapEngine;

//ctor injections etc. etc.

public void RunDungeon(List dungeonEvents)
{
foreach(var event in dungeonEvents)
{
// my issue starts here
switch(event)
{
case event is CombatEvent:
CombatEngine.Run(event as CombatEvent);
case event is TreasureEvent:
TreasureEngine.Run(event as TreasureEvent);
//etc etc
}
}
}
}
Это работает нормально, но выглядит нарушением принципа открытости-закрытости.
В идеале я бы хотел, чтобы что-то выглядело немного вот так:

Код: Выделить всё

public void RunDungeon(List dungeonEvents)
{
foreach(var event in dungeonEvents)
{
event.Run();
}
}
Но здесь есть проблемы. На данный момент все наши классы, реализующие IEvent, по сути, представляют собой просто данные, описывающие, как что-то работает (с каким монстром вы сражаетесь, какое сокровище вы находите и т. д.), а классы Engine обрабатывают это в реальной игре. что-то происходит.
Чтобы сделать это в приведенном выше примере, сами события должны иметь зависимость от соответствующего движка, что определенно неправильно.< /p>
Может ли кто-нибудь предложить лучший подход? Нам действительно не нужен бесконечно расширяющийся оператор switch.

Подробнее здесь: https://stackoverflow.com/questions/789 ... ependencie
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»