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;
還是合法的。
這樣的設計,
就好像說話,
只有我自己可以用我的嘴說話,
沒人可以用我的嘴說話, 不然會產生很多誤會。
但聽的人可以自由的告訴我, 他想聽什麼,
當我要說他想聽的東西的時候, 就會去跟他說。