c#用委托來實現(xiàn)事件通知機制。委托相當與c++函數(shù)指針。整個過程涉及一個呼叫者,一個被呼叫者,還有就是這個委托。
- 實現(xiàn)步驟
有以下幾步: 1. 申明委托, 2.定義呼叫者和調(diào)用的函數(shù), 3.定義被呼叫者和具體實現(xiàn)的函數(shù)(被調(diào)用的函數(shù))1.申明委托 ,在包里或者類里,
public
public delegate void PlayGame(Object sender, EventArgs e);
public delegate void PlayGame(Object sender, EventArgs e);
2.定義呼叫者(類LetsGame)和調(diào)用委托的函數(shù),在呼叫者里要有委托的實例(呼叫者扔出一個委托,被呼叫者給這個委托賦值)
class LetsGame{
public event PlayGame theGame;
public void startPlay(EventArgs e){
if(theGame != null){
theGame(this,e);
}
}
public event PlayGame theGame;
public void startPlay(EventArgs e){
if(theGame != null){
theGame(this,e);
}
}
3. 定義被呼叫者(類MS)和具體實現(xiàn)的函數(shù)(被調(diào)用的函數(shù)),也就是concrete class的實現(xiàn)或者叫函數(shù)指針實例。打個比方,在一個叫MS的類中實現(xiàn).MS中對呼叫者中委托的實例進行賦值.
class MS {
public MS(LetsGame lg) {
lg.theGame += new PlayGame(MSPlayGame);
}
public void MSPlayGame(Object sender, EventArgs e){
Console.WriteLine("Who laughs the last who wins");
}
}
public MS(LetsGame lg) {
lg.theGame += new PlayGame(MSPlayGame);
}
public void MSPlayGame(Object sender, EventArgs e){
Console.WriteLine("Who laughs the last who wins");
}
}
這樣當調(diào)用LetsGame.startPlay的時候就會調(diào)用MS.MSPlayGame.
- 實際應用
對照一下c#的GUI事件處理或者asp.net的web控件事件處理,能幫我們更好的理解委托和事件.大家一定很熟悉asp.net里下面的代碼private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
}
private void Button1_Click(object sender, System.EventArgs e)
{
//do sth
}
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
}
private void Button1_Click(object sender, System.EventArgs e)
{
//do sth
}
這就是用委托來實現(xiàn)事件.你可能發(fā)現(xiàn)我們并沒有給它聲明委托對象并通過event關鍵字來引用該委托對象,那是因為asp.net早就幫我們做好了該項工作,其委托對象是System.EventHandler. Button1相當于上面的LetsGame的實例,是呼叫者,Button1_Click是被呼叫方法.當你click Button1后,Button1就會調(diào)用Button1_Click.
-雜項
我覺得這種機制和design pattern里的observer很類似,我們完全可以用observer來達到同樣的效果,但是用委托更靈活,不需要定義一個interface然后所有的concrete class都實現(xiàn)某個方法,函數(shù)指針(委托)更靈活.還有,委托不一定非要和事件一起用,單獨用的時候就是函數(shù)指針.