302班

          java突擊隊
          posts - 151, comments - 74, trackbacks - 0, articles - 14
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          委托與事件

          Posted on 2007-06-15 19:45 停留的風 閱讀(142) 評論(0)  編輯  收藏
          c#用委托來實現事件通知機制。委托相當與c++函數指針。整個過程涉及一個呼叫者,一個被呼叫者,還有就是這個委托。

          - 實現步驟

          有以下幾步: 1. 申明委托, 2.定義呼叫者和調用的函數, 3.定義被呼叫者和具體實現的函數(被調用的函數)

          1.申明委托 ,在包里或者類里,
          public
            public delegate void PlayGame(Object sender, EventArgs e); 

          2.定義呼叫者(類LetsGame)和調用委托的函數,在呼叫者里要有委托的實例(呼叫者扔出一個委托,被呼叫者給這個委托賦值)
          class LetsGame{ 
              
          public event PlayGame theGame; 
              
          public void startPlay(EventArgs e){ 
                  
          if(theGame != null){ 
                  theGame(
          this,e); 
              } 

          3. 定義被呼叫者(類MS)和具體實現的函數(被調用的函數),也就是concrete class的實現或者叫函數指針實例。打個比方,在一個叫MS的類中實現.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"); 
              } 
          }

          這樣當調用LetsGame.startPlay的時候就會調用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
          }

          這就是用委托來實現事件.你可能發現我們并沒有給它聲明委托對象并通過event關鍵字來引用該委托對象,那是因為asp.net早就幫我們做好了該項工作,其委托對象是System.EventHandler. Button1相當于上面的LetsGame的實例,是呼叫者,Button1_Click是被呼叫方法.當你click Button1后,Button1就會調用Button1_Click.

          -雜項

          我覺得這種機制和design pattern里的observer很類似,我們完全可以用observer來達到同樣的效果,但是用委托更靈活,不需要定義一個interface然后所有的concrete class都實現某個方法,函數指針(委托)更靈活.

          還有,委托不一定非要和事件一起用,單獨用的時候就是函數指針.

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 平潭县| 许昌县| 金昌市| 巴楚县| 新竹县| 祁阳县| 闵行区| 武冈市| 广南县| 兴宁市| 开远市| 凤凰县| 广昌县| 沛县| 澎湖县| 开江县| 醴陵市| 邯郸县| 白银市| 永安市| 博湖县| 乐安县| 宜兰市| 德清县| 新安县| 大厂| 武乡县| 安丘市| 越西县| 陕西省| 调兵山市| 怀化市| 筠连县| 盐源县| 贡嘎县| 邻水| 巴东县| 兴化市| 河津市| 习水县| 丹江口市|