什么是好的处理接口特定方法的方法?

时间:2019-04-15 22:55:53

标签: c# design-patterns

假设我有:

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

然后我要为我的Buff实现触发器

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

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

所以现在我可以在buff上实现这些方法了。

我有以下方法:

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 个答案:

答案 0 :(得分:1)

我认为触发的一种简单方法就是简单地使用不同的方法

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的Buff并将其强制转换为T,从而轻松调用相应的方法。

请注意,泛型类型参数始终在编译时解析,即它们在运行时不会为您提供动态行为。因此void TriggerBuffs<TriggerType>(Player p)不允许您动态选择触发器。

如果要执行此操作,请使用枚举

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;
    }
}