老實說我都不知道這到底是 Unity的資料蒐集 還是 C# 學習日誌 了
嘛,反正都是學習日誌就是啦~
C / C++ 的 Function Pointer,也就是C# 的Delegate
都是為了將「Function」當成物件丟來丟去而衍生的用法
為什麼我會需要呢?
因為有一個系統,我會利用它產生很多子系統
而我希望這些子系統會經過一個分配篩選,而分別從不同的管道對這位老爸爸進行回報
所以我要在產生這些子系統的同時,分派給他們回報的管道,也就是Function
那就會用到這個了,總不能我還一個一個去改這些子系統呀 ~ 那會累死
用法是像這樣
宣告一個delegate Function
public delegate bool Func(int nNumber);
這表示了我宣告一個叫作 Func 的Delegate函數,這函數可以丟進一個 INT 然後回傳 BOOL
然後我要丟進的 Function 可以這樣寫
public void TestFunction(Func oJudgeFunc)
{
if ( oJudgeFunc (丟數字) )
Debug.Log ( " 外部判定 Function 通過 " );
e;se
Debug.Log ( " 外部判定 Function 沒通過 " );
}
而 Call 的時候則這樣使用
先準備一個符合樣式的判定Funciton
public bool JudgeFuncA (int nNumber)
{
return ( nNumber < 0 );
}
然後丟進去
TestFunction ( new Func(JudgeFuncA) );
大概類似這樣的用法,你可以丟好幾種不同的判定 Function 以取得不同狀況下的判定結果
可以由外部決定這個Function 內的關鍵判定是由哪個Function 來解決
就不需要自己一個一個手動去改
至於還有一個很重要的部分,子系統如何去承接著這個 Function 以保留多次使用呢?
關鍵在於這行
class A
{
public delegate bool Func(int nNumber);
}
這行其實你就已經建立了一種新的 Type 就叫 Func
不過因為它是靜態宣告在A裡面,記得前面要加上 A. 當前墜
因此你只要把這個當成一種型態來宣告一個物件來承接就行了
例如
class B
{
public A.Func oFuncContain= null;
public void SetFunc (A.Func oFunc)
{
oFuncContain = oFunc;
}
}
這樣你之後只需要呼叫 oFuncContain() 就可以了!
__________________________________
Have a nice Day