第9章委托與事件_第1頁(yè)
第9章委托與事件_第2頁(yè)
第9章委托與事件_第3頁(yè)
第9章委托與事件_第4頁(yè)
第9章委托與事件_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第9章接口、委托和事件【本章導(dǎo)讀】 本章內(nèi)容接口、委托和事件是面向?qū)ο蟪绦蛟O(shè)計(jì)中較深和較難的部分,各位在學(xué)習(xí)的過(guò)程中要結(jié)合前后部分的知識(shí)細(xì)細(xì)體會(huì)。9.1接口在軟件開(kāi)發(fā)過(guò)程中,有時(shí)我們編寫(xiě)的程序需要提供給外部商家進(jìn)行二次開(kāi)發(fā)或者其它的服務(wù),但我們又不希望他們看見(jiàn)我們程序的內(nèi)部細(xì)節(jié),在此情況下,我們可以把我們的產(chǎn)品做成組件,用接口描述組件對(duì)外提供的服務(wù)。組件和組件之間、組件和客戶之間都通過(guò)接口進(jìn)行交互,所以接口在軟件設(shè)計(jì)過(guò)程中還是一個(gè)很重要的知識(shí)。9.1.1接口的含義接口(interface) 用來(lái)定義一種程序的協(xié)定。實(shí)現(xiàn)接口的類(lèi)與接口的定義嚴(yán)格一致。接口可以包含方法、屬性、事件和索引器。接口本身不提供它所定義的成員的實(shí)現(xiàn)。接口只指定實(shí)現(xiàn)該接口的類(lèi)或接口必須提供的成員。所以接口不能被實(shí)例。9.1.2定義接口

定義接口使用的關(guān)鍵字為interface,其一般形式為:[修飾符]interface接口名稱[:基接口列表]{ 接口體成員列表}其中,允許使用的修飾符有:public、protected、internal、private。在一個(gè)接口定義中同一修飾符不允許出現(xiàn)多次,new修飾符只能出現(xiàn)在嵌套接口中,表示覆蓋了繼承而來(lái)的同名成員。public,protected,internal,andprivate修飾符定義了對(duì)接口的訪問(wèn)權(quán)限。9.1.2定義接口【實(shí)作任務(wù)】例9.1定義一個(gè)客車(chē)類(lèi)的接口,該接口向外提供一個(gè)此車(chē)重量、車(chē)牌號(hào)的接口和一個(gè)輸出車(chē)相關(guān)信息方法的接口

interfaceIPasstrain{intWeight{get;set;}stringPlate{get;set;}voidShowinfo();}9.1.3實(shí)現(xiàn)接口

【實(shí)作任務(wù)】實(shí)現(xiàn)接口IPasstrain

classPasstrain:IPasstrain//類(lèi)名為Passtrain(客車(chē)){ //以下實(shí)現(xiàn)接口中的Weight屬性 publicintWeight { get{returnweight;}//提供對(duì)weight的讀權(quán)限 set{weight=value;}//提供對(duì)weight的寫(xiě)權(quán)限 } //以下實(shí)現(xiàn)接口中的Plate屬性 publicstringPlate { get{returnplate;}//提供對(duì)plate的讀權(quán)限 set{plate=value;}//提供對(duì)plate的寫(xiě)權(quán)限 } //以下實(shí)現(xiàn)接口中的Showinfo方法 publicvoidShowinfo() { System.Console.WriteLine("我是客車(chē)"); System.Console.WriteLine("我的重量是:"+Weight); }}9.1.3實(shí)現(xiàn)接口測(cè)試代碼classTest{staticvoidMain(){IPasstrainp=newPasstrain();p.Weight=1000;p.Showinfo();}}運(yùn)行結(jié)果9.2委托委托是C#中的一種引用類(lèi)型,主要用于.NETFramework中的事件處理程序和回調(diào)函數(shù)。一個(gè)委托可以看作一個(gè)特殊的類(lèi),因而它的定義可以像常規(guī)類(lèi)一樣放在同樣的位置。與其他類(lèi)一樣,委托必須先定義以后,再實(shí)例化。9.2委托委托派生于基類(lèi)System.Delegate,不過(guò)委托的定義和常規(guī)類(lèi)的定義方法不太一樣。委托的定義通過(guò)關(guān)鍵字delegate來(lái)定義:publicdelegateintmyDelegate(intx,inty);代碼定義了一個(gè)新委托,它可以封裝任何返回為int,帶有兩個(gè)int類(lèi)型參數(shù)的方法。9.2委托步驟2:實(shí)例委托實(shí)例publicintsub(intx,inty){Console.WriteLine(x+y);}myDelegatecal=newmyDelegate(sub);cal(10,3);步驟1:定義方法步驟3:可以直接使用cal調(diào)用sub方法可通過(guò)以下步驟使用定義的委托9.2委托委托可以使用+運(yùn)算符號(hào)將多個(gè)委托組合在一起,或使用–運(yùn)算符號(hào)從組合委托中減去一個(gè)委托。參考:publicintfub(intx,inty){Console.WriteLine(x-y);}myDelegatemyd=newmyDelegate(fub);//再定義一個(gè)委托實(shí)例myd(10,3);//利用委托實(shí)例調(diào)用fub方法myDelegatezong=cal+myd;//定義委托zong(10,3);//此時(shí)再調(diào)用此時(shí)輸出: 13 79.3事件事件是什么?為什么要學(xué)習(xí)事件?

我們?cè)诘诙膶W(xué)習(xí)時(shí)已經(jīng)接觸過(guò)很多事件了,比如窗體加載、按鈕點(diǎn)擊、鼠標(biāo)雙擊等等,這些事件都是.NET封裝和集成好,且通過(guò)事件面板可以很方便的添加到程序中的,但是否知道其中運(yùn)行機(jī)制,我想很多同學(xué)都還不是很清楚,這都需要進(jìn)一步的學(xué)習(xí),而且象我們目前解決的客車(chē)超速時(shí)要警示駕駛員這樣的事件在.NET中也是沒(méi)有現(xiàn)成的,很多情況下都還需要我們自己定義事件。

9.3事件事件的定義用關(guān)鍵字event聲明,不過(guò)聲明事件之前必須存在一個(gè)委托(這個(gè)委托一般根據(jù)編制的事件編寫(xiě)):publicdelegatevoidEventHandler(objectsender,EventArgse);然后定義事件:publiceventEventHandlerOnEventHandler;9.3事件若存在事件處理程序:publicvoidbuttonCreate_Click(objectsender,EventArgse){Console.Write("事件代碼被觸發(fā)");}可用下面代碼將事件處理程序和事件聯(lián)系起來(lái):OnEventHandler+=newEventHandler(buttonCreate_Click);9.3事件【多學(xué)一點(diǎn)】事件參數(shù)事件處理程序一般接收兩個(gè)參數(shù),一個(gè)為object,表明發(fā)送事件的源,一個(gè)為EventArgs,表明事件發(fā)生時(shí)向事件處理程序傳遞的參數(shù),這兩個(gè)類(lèi)型都是.NET自帶的,但是這不是必須的,只是程序員一般在編寫(xiě)事件的時(shí)候都設(shè)置這兩個(gè)參數(shù)。9.3事件【實(shí)作任務(wù)】設(shè)計(jì)程序,當(dāng)客車(chē)速度超過(guò)設(shè)定時(shí)速時(shí)觸發(fā)相應(yīng)事件從而警示駕駛員客車(chē)超速。classPasstrain//類(lèi)名為Passtrain(客車(chē)){publicstaticfloatSMAX=100;//靜態(tài)公有字段,最大時(shí)速privatefloatnowv;//客車(chē)的當(dāng)前時(shí)速字段//定義事件的委托publicdelegatevoidChangedEventHandler(objectsender,EventArgse);//定義一個(gè)事件publiceventChangedEventHandlerChanged;//用以觸發(fā)Change事件protectedvirtualvoidOnChanged(EventArgse){if(this.Changed!=null)this.Changed(this,e);}9.3事件 //客車(chē)的當(dāng)前時(shí)速屬性 publicfloatNowv{ get{returnnowv;} set{nowv=value; //時(shí)速改變時(shí)觸發(fā)Change事件 this.OnChanged(newEventArgs()); }}}classProgram{staticvoidMain(string[]args){Passtrainpss=newPasstrain();//將事件處理程序添加到事件的調(diào)用列表中(即事件布線)pss.Changed+=newPasstrain.ChangedEventHandler(NowV_Changed);//設(shè)置屬性值,觸發(fā)相應(yīng)的事件pss.Nowv=80;pss.Nowv=120;Console.Read();}//對(duì)Change事件處理的程序privatestaticvoidNowV_Changed(objectsender,EventArgse){ if(((Passtrain)sender).Nowv<Passtrain.SMAX) Console.WriteLine("客車(chē)時(shí)速在正常范圍內(nèi)!"); else Console.WriteLine("客車(chē)時(shí)速太大,危險(xiǎn)!");}}9.3事件解析

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論