Как избежать операторов переключения регистров в 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

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