delegate可以想成 class of function pointer array
delegate void EventHandler( int arg );
等同於 C / C++中的
typedef void (*EventHandler)( int arg );
delegate是一種型別(class), 要宣告後才能使用.
eg. of C#
class Foo{ public: EventHandler myEvent; } // class that recv event! class Listener{ public void recvFunc( int arg ){ //print arg } } // func that fire event! void fireFunc(){ Foo myfoo = new Foo(); Listener listener = new Listener(); myfoo.myEvent += listener.recvFunc; myfoo.myEvent( 5 ); }
這樣就會印出5
其實有了delegate 就可以實作event系統,
但event是幹嘛用的呢?
event 這個keyword是一個修飾詞 就像 const, static, virtual一樣,
他專門修飾delegate,
例如
class Foo{ //修飾 型別(class) 物件(object) event EventHandler myEvent; }
那event修飾了什麼?
如果delegate沒有event修飾, 它可以被物件外的程式碼呼叫,
例如前例的
myfoo.myEvent(5);
但加上event後則不能,
所以
myfoo.myEvent(5);
這一行compiler就不會過。
但是delegate仍可以被物件以外的程式嗎加掛 recv function
所以
myfoo.myEvent += listener.recvFunc;
還是合法的。
這樣的設計,
就好像說話,
只有我自己可以用我的嘴說話,
沒人可以用我的嘴說話, 不然會產生很多誤會。
但聽的人可以自由的告訴我, 他想聽什麼,
當我要說他想聽的東西的時候, 就會去跟他說。