// 将 string 类型替换为 BattleNotifyData public static void SendNotify(string eventType, BattleNotifyData data = null) { // 如果是空的就没必要通知 if (!subscribers.ContainsKey(eventType)) { Debug.Log(eventType + "是空的"); return; }
foreach (Subscriber subscriber in subscribers[eventType]) { subscriber.TakeNotify(eventType, data); } }
OK,这样就完成了! 接着来写几个类,让它们继承 BattleNotifyData :
1 2 3 4 5 6 7 8 9 10 11 12 13
// 第一个类:用于战斗结束的通知参数 public class BattleNotifyData_BattleEnd : BattleNotifyData { // 获胜的阵营 public string camp; }
// 第二个类:用于角色死亡的通知 public class BattleNotifyData_OnDead : BattleNotifyData { // 死者(是一个 BattleCharacter 类型) public BattleCharacter victim; }
最后我们只需要这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
public override void TakeNotify(string eventType, BattleNotifyData data) { switch (eventType) { case Constant.BATTLE_EVENT_BATTLE_END: var newData = data as BattleNotifyData_BattleEnd; // 现在可以拿到camp变量了 Debug.Log(newData.camp); break; case Constant.BATTLE_EVENT_ON_DEAD: var newData = data as BattleNotifyData_On_Dead; // 可以拿到死者对象 Debug.Log(newData.victim); break; } }
通过 as 参数将父类转化为对应的子类即可! 发送通知的时候,可以实例化真实的类:
1 2 3 4 5
// 当角色死亡的时候,实例化 BattleNotifyData_OnDead 作为参数传递 BattleNotifyPublisher.SendNotify(Constant.BATTLE_EVENT_ON_DEAD, new BattleNotifyData_OnDead { victim = this });
总结
当我们要让一个函数只接受一个参数,还要求这个参数是「可变」的,那就利用类的多态来实现。
特别篇
有时候一个方法有超多的参数:
1 2 3
public void Test(string a, string b, int c, floa d) { // ... }