Что такое хороший подход для обработки специфических методов интерфейса? - PullRequest
0 голосов
/ 16 апреля 2019

Допустим, у меня есть:

public class Buff {
  ... code ...
}

Затем я реализую триггеры для моего Buff

public interface IBuffOnActionTrigger {
   void OnPlayerAction(Player p);
}

public interface IBuffOnPlayerDie {
   void OnPlayerDie(Player p);
}

Так что теперь я могу реализовать эти методы в баффе.

У меня есть следующий метод:

public void TriggerBuffs<TriggerType>(Player p) {
    p.Buffs.Where(b => b is TriggerType).ForEach(b => b.<CALLMETHOD>);
}

В данном случае я использую чехол Switch

switch typeof(TriggerType):
   case IBuffOnPlayerDie:
      buff.OnPlayerDie(p);
   ... etc  

Но я искал способ сделать это более элегантно. Что было бы хорошим дизайном для этого?

1 Ответ

1 голос
/ 16 апреля 2019

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

public void TriggerActions(Player p)
{
    foreach (var buff in p.Buffs.OfType<IBuffOnActionTrigger>()) {
        buff.OnPlayerAction(p);
    }
}

public void TriggerPlayerDie(Player p)
{
    foreach (var buff in p.Buffs.OfType<IBuffOnPlayerDie>()) {
        buff.OnPlayerDie(p);
    }
}

OfType<T>() фильтрует баффы, реализующие T, и приводит их к T, что упрощает вызов соответствующегоmethod.

Обратите внимание, что параметры универсального типа всегда разрешаются во время компиляции, т. е. они не дают динамического поведения во время выполнения.Поэтому void TriggerBuffs<TriggerType>(Player p) не позволяет вам динамически выбирать триггер.

Если вы хотите сделать это, используйте enum

public enum TriggerType
{
    None,
    Action,
    PlayerDie
}

, теперь вы можете динамически вызывать разные типы триггеров:

public void Trigger(TriggerType triggerType, Player p)
{
    switch (triggerType) {
        case TriggerType.None:
            break;
        case TriggerType.Action:
            TriggerActions(p);
            break;
        case TriggerType.PlayerDie:
            TriggerPlayerDie(p);
            break;
        default:
            break;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...