<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    302班

    java突擊隊(duì)
    posts - 151, comments - 74, trackbacks - 0, articles - 14
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    委托與事件

    Posted on 2007-06-15 19:45 停留的風(fēng) 閱讀(142) 評(píng)論(0)  編輯  收藏
    c#用委托來(lái)實(shí)現(xiàn)事件通知機(jī)制。委托相當(dāng)與c++函數(shù)指針。整個(gè)過(guò)程涉及一個(gè)呼叫者,一個(gè)被呼叫者,還有就是這個(gè)委托。

    - 實(shí)現(xiàn)步驟

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

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

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

    3. 定義被呼叫者(類MS)和具體實(shí)現(xiàn)的函數(shù)(被調(diào)用的函數(shù)),也就是concrete class的實(shí)現(xiàn)或者叫函數(shù)指針實(shí)例。打個(gè)比方,在一個(gè)叫MS的類中實(shí)現(xiàn).MS中對(duì)呼叫者中委托的實(shí)例進(jìn)行賦值.
    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"); 
        } 
    }

    這樣當(dāng)調(diào)用LetsGame.startPlay的時(shí)候就會(huì)調(diào)用MS.MSPlayGame.


    - 實(shí)際應(yīng)用

    對(duì)照一下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
    }

    這就是用委托來(lái)實(shí)現(xiàn)事件.你可能發(fā)現(xiàn)我們并沒有給它聲明委托對(duì)象并通過(guò)event關(guān)鍵字來(lái)引用該委托對(duì)象,那是因?yàn)閍sp.net早就幫我們做好了該項(xiàng)工作,其委托對(duì)象是System.EventHandler. Button1相當(dāng)于上面的LetsGame的實(shí)例,是呼叫者,Button1_Click是被呼叫方法.當(dāng)你click Button1后,Button1就會(huì)調(diào)用Button1_Click.

    -雜項(xiàng)

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

    還有,委托不一定非要和事件一起用,單獨(dú)用的時(shí)候就是函數(shù)指針.

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: av电影在线免费看| 亚洲精品视频在线观看免费| 亚洲精品无码久久久久去q| 久久精品无码精品免费专区| 亚洲1234区乱码| 亚洲国产精品成人| 久久久国产精品无码免费专区| 精品亚洲AV无码一区二区 | 日本在线看片免费人成视频1000| 亚洲导航深夜福利| 亚洲A∨午夜成人片精品网站| 中文无码成人免费视频在线观看| 2020年亚洲天天爽天天噜| 亚洲最大av无码网址| 日韩免费一区二区三区在线| 在线播放免费人成视频网站| 亚洲最大的视频网站| 亚洲人成影院在线无码观看| 毛片免费全部免费观看| 国产午夜无码精品免费看动漫| 国产亚洲精品VA片在线播放| 亚洲AV无码成人网站久久精品大 | 久久99国产乱子伦精品免费| 无码亚洲成a人在线观看| 亚洲免费在线播放| 国产人成免费视频| 114一级毛片免费| 中国精品一级毛片免费播放| 亚洲一线产区二线产区区| 亚洲第一中文字幕| 亚洲伊人久久综合影院| AV免费网址在线观看| 免费无码一区二区三区| caoporm超免费公开视频| 亚洲精华国产精华精华液网站| 亚洲国产精品婷婷久久| 久久精品国产精品亚洲| 国产国产人免费人成免费视频 | 亚洲愉拍一区二区三区| 亚洲理论片在线观看| 亚洲AV无码一区二区三区系列|