假设我有:
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
但是我一直在寻找一种更优雅的方法。对此有什么好的设计?
答案 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;
}
}