—–有輸出委派—–<

委派通常就是只設定一個調用項目,事件就是不只一個

-基本-< 建立Func<in T,out TResult>的有輸入、輸出委派 Func<string, int> inputOutputEvent; (命名錯誤,應該是 inputOutputHandler)

註冊事件 inputOutputEvent = FunctionA; (void FunctionA(string inputString) { print(inputString); return 10; })

取消註冊 inputOutputEvent = null;

觸發事件 int out = inputOutputEvent.Invoke(“inString”); print(out);

當事件觸發時,被註冊進event的function都會受到調用,而function的參數(string inputString)都會輸入為Invoke時的參數(“invoke”), 而觸發的事件會回傳 Function 的回傳子(return 10) 當前情況為 Print出 inString ,10

-實際情況、運用-< 以戰棋單位(unit)造成的傷害公式為例,單位A_1先對單位B_1發動攻擊,再對B_2發動攻擊,傷害基礎值為10(basisDamage = 10)

建立event - Func<int, int> calculateDamageEvent;

Function(不同腳本) - int UnitB1DamageFunction(int basisDamage) { int realDamage = basisDamage / 2; return realDamage; }

int UnitB2DamageFunction(int basisDamage) { int realDamage = basisDamage * 2; return realDamage; }

calculateDamageEvent = UnitB1DamageFunction; int realDamage = calculateDamageEvent.Invoke(basisDamage);

calculateDamageEvent = UnitB2DamageFunction; int realDamage = calculateDamageEvent.Invoke(basisDamage);

情況 - 當A_1對單位B_1發動攻擊時,回傳的實際傷害(realDamage)為 basisDamage(10) / 2 = 5 當A_1對單位B_2發動攻擊時,回傳的實際傷害(realDamage)為 basisDamage(10) * 2 = 20

-需要注意的點-< inputOutputEvent可以用 += 註冊(不過通常不會這麼做),但Func收到的回傳只會是最後註冊的Function的回傳值

—–有輸出委派—–<