日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面向对象——一起来复习托付与事件!

發(fā)布時間:2023/12/9 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面向对象——一起来复习托付与事件! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
事件與托付事實上并不難理解。僅僅是由于它們的使用方式與經(jīng)常使用的編碼有非常大的區(qū)別,例如通常編寫的都是同步代碼,調(diào)用一個類型的方法,會即刻出現(xiàn)方法運行的結(jié)果。這是符合邏輯的。但在某些情況中,同步代碼未必滿足需求,拿近期的打車軟件打個例如。搭車者發(fā)送一個信息,就會推送給附近的司機,使用同步代碼,搭車對象肯定須要調(diào)用司機中心對象,這樣就出現(xiàn)了我們一直不愿意看到的情況:兩個類型緊密地耦合在一起。既然要其他類型對自己的行為作出反應(yīng)。親自調(diào)用其類型的方法似乎不可避免。在同步代碼中。非常難避免這樣的緊密的類型調(diào)用關(guān)系。而我們的代碼中,更是非常少會考慮將一個方法傳遞給還有一個方法。

我們回想在設(shè)計模式中。實現(xiàn)觀察者模式的樣例。有一家公司,董事長不希望自己的雇員在上班時間玩游戲,但又不可能每時每刻都盯著每一個雇員,因此。他希望使用一種新的方式實現(xiàn)監(jiān)視雇員的效果:假設(shè)有雇員違反規(guī)則。某個設(shè)備或?qū)iT的監(jiān)查人員將自己主動發(fā)出一個消息通知他。董事長僅僅須要在事情發(fā)生時進行處理。 因此,這個用例實際上是兩種類型——董事長類與雇員類——之間的交互,以下我們來看看怎樣使用托付與事件機制實現(xiàn)這樣的交互:

舉例:

首先,我們須要在董事長類與雇員類之間定義一個托付。用于傳遞兩者之間的事件。舉個樣例,這就相當于那個向老板報告的人(通知老板誰玩游戲了): ? ? /// <summary>/// 監(jiān)聽的者的托付/// </summary>public delegate void DelegateClassHandle();?
托付的返回值類型為void,這并不是表示托付類型本身帶有返回值,該返回值類型是指托付的目標函數(shù)類型,即它托付的一個事件處理函數(shù)返回值是void類型。 新建一個雇員類Employee,其代碼例如以下: /// <summary>/// 雇員類/// </summary>class Employee{/// <summary>/// 員工玩游戲事件(事件類型為監(jiān)聽者托付)/// </summary>public event DelegateClassHandle PlayGame;/// <summary>/// 員工玩游戲的方法/// </summary>public void Games(){if (PlayGame != null){PlayGame();}} ?}
雇員類Employee代碼中定義了一個DelegateClassHandle類型的事件PlayGame。它的定義方式也非常特殊,keywordevent表示PlayGame是一個事件。同一時候還必須聲明該事件的托付類型為DelegateClassHandle。即將來由該類型的托付對象負責通知事件。 假設(shè)有雇員開始玩游戲。它將運行Games方法,而僅僅要該方法一被調(diào)用,就會觸發(fā)一個事件PlayGame,然后董事長就會收到這個事件的消息——有人在玩游戲了。

董事長類代碼例如以下,他有一個方法Notify用于接收消息: ? ? /// <summary>/// 老板類,相當于監(jiān)聽者傳送的對象/// </summary>class Boss{/// <summary>/// 老板通知的方法/// </summary>public void Notify(){System.Console.WriteLine("如今。有人玩游戲,趕緊去抓人!");} ?}
Employee的PlayGame事件怎樣與Admin的Notify方法關(guān)聯(lián)起來呢?僅僅需通過事件綁定就可以實現(xiàn),詳細步驟例如以下列代碼: ?class Program{static void Main(string[] args){//實例員工類和老板對象Employee employee = new Employee();Boss boss = new Boss();//將員工的玩游戲方法增加到監(jiān)聽者中employee.PlayGame += new DelegateClassHandle(boss.Notify);employee.Games();?}}
終于的結(jié)果為:
請大家注意事件綁定的代碼:

升級版本號:

老板希望知道哪個個員工完了游戲 從該EventArgs類派生一個自己定義的事件參數(shù)類CustomeEventArgs。這個類型將攜帶雇員姓名和年齡信息: <pre name="code" class="csharp" style="color: rgb(51, 51, 51); font-size: 14px; line-height: 26px;">public class CustomeEvetnArgs : EventArgs {string name = "";int age = 0;public CustomeEvetnArgs(){ }public string Name{get { return this.name; }set { this.name = value; }}public int Age{get { return this.age; }set { this.age = value; }} }
改動托付類型DelegateClassHandle的定義。讓其攜帶必要的參數(shù): public delegate void DelegateClassHandle(object sender, CustomeEvetnArgs e);

雇員類的代碼改動后例如以下: /// <summary>/// 員工玩游戲事件(事件類型為監(jiān)聽者托付)/// </summary>public event DelegateClassHandle PlayGame;private string _name;public string Name{get { return _name; }set { _name = value; }}private int _age;public int Age{get { return _age; }set { _age = value; }}/// <summary>/// 員工玩游戲的方法/// </summary>public void Games(){if (PlayGame != null){CustomeEvetnArgs e = new CustomeEvetnArgs();e.Name = this._name;e.Age = this._age;PlayGame(this,e);}} ?}

在Games方法中,首先新建一個CustomeEventArgs對象,然后設(shè)置了必要的屬性Name和Age。 董事長的通知方法也必須對應(yīng)地進行改動: ?/// <summary>/// 老板類,相當于監(jiān)聽者傳送的對象/// </summary>class Boss{/// <summary>/// 老板通知的方法/// </summary>public void Notify(object sender, CustomeEvetnArgs e){System.Console.WriteLine("有人玩游戲了,名字是: "+e.Name + " 年齡是: " + e.Age.ToString());} ?}

將兩個類型對象進行關(guān)聯(lián)的代碼進行對應(yīng)的改動: //實例員工類和老板對象Employee employee = new Employee();Boss boss = new Boss(); <span style="font-family: Arial;">? ? ? ? ? <span style="white-space:pre"> </span>employee.Name = "張三";</span>employee.Age = 25;employee.PlayGame += new DelegateClassHandle(boss.Notify);employee.Games();

執(zhí)行結(jié)果:

?多路廣播:

實際。我們還要清除一個概念,托付是能夠多路廣播(Mulitcast)的,即一個事件能夠托付給多個對象接收并處理。比方經(jīng)理也要處理員工的玩游戲事件,也能夠讓托付對象將雇員的PlayGame事件通知他。 首先定義經(jīng)理類: public class Manager {public void Notify(object sender, CustomeEvetnArgs e){System.Console.WriteLine(sender.ToString() + "-" + e.Name);} }

經(jīng)理Manager類型的Notify方法與Admin一致,他也接受到對應(yīng)的信息。仍然是使用+=運算符。其方法如以下的代碼所看到的: Employee employee = new Employee(); employee.Name = "Mike"; employee.Age = 25; Admin admin = new Admin(); Manager manager = new Manager();employee.PlayGame += new DelegateClassHandle(admin.Notify); employee.PlayGame += new DelegateClassHandle(manager.Notify); employee.Games();調(diào)用結(jié)果為:

總結(jié):

我們通過兩幅圖看一下採用了托付和事件和普通調(diào)用的差別:



通過復習托付與事件,我們知道了對象間的關(guān)系不只存在調(diào)用這樣的耦合性較強的關(guān)系,還有通過這一系列的操作,交由托付機制這個第三方來統(tǒng)一管理。是個不一樣的選擇,而這個不一樣是不是更適用于“高內(nèi)聚,低耦合”這句話呢?我們曾經(jīng)對面向?qū)ο蟮恼J識,是不是停留在對象。而沒有在類的級別。及架構(gòu)的級別進行了思考呢?我想。我們應(yīng)該進行一次深入的面向?qū)ο蟮纳钊胗懻摿?#xff0c;隨著我的學習。后期博文會逐步跟進!

轉(zhuǎn)載于:https://www.cnblogs.com/gcczhongduan/p/5076761.html

總結(jié)

以上是生活随笔為你收集整理的面向对象——一起来复习托付与事件!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。