OOP基礎(chǔ)-屬性和委托事件_第1頁(yè)
OOP基礎(chǔ)-屬性和委托事件_第2頁(yè)
OOP基礎(chǔ)-屬性和委托事件_第3頁(yè)
OOP基礎(chǔ)-屬性和委托事件_第4頁(yè)
OOP基礎(chǔ)-屬性和委托事件_第5頁(yè)
已閱讀5頁(yè),還剩27頁(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)介

1、1 屬性5.5.1 屬性屬性2在類(lèi)中屬性采用如下方式進(jìn)行聲明:在類(lèi)中屬性采用如下方式進(jìn)行聲明:修飾符修飾符屬性的類(lèi)型名屬性名屬性的類(lèi)型名屬性名get /讀訪問(wèn)器讀訪問(wèn)器/可執(zhí)行語(yǔ)句可執(zhí)行語(yǔ)句 set /寫(xiě)訪問(wèn)器寫(xiě)訪問(wèn)器/可執(zhí)行語(yǔ)句可執(zhí)行語(yǔ)句屬性修飾符有屬性修飾符有new、public、protected、internal、private、static、virtual、override和和abstract共共9種。種。其中讀、寫(xiě)屬性的過(guò)程分別用其中讀、寫(xiě)屬性的過(guò)程分別用get訪問(wèn)器和訪問(wèn)器和set訪問(wèn)器來(lái)表示。訪問(wèn)器來(lái)表示。若若只包含只包含get,此為只讀屬性;只包含,此為只讀屬性;只包含set

2、,則為只寫(xiě)屬性。,則為只寫(xiě)屬性。 屬性聲明3【例【例5-21】字段和屬性示例。using System; public class Student private int nAge;/私有域私有域 public int Age/屬性,用戶控制對(duì)域的訪問(wèn)屬性,用戶控制對(duì)域的訪問(wèn) get return this.nAge; set if (value != this.nAge & value 0) this.nAge = value; 示例關(guān)鍵字關(guān)鍵字value接收接收用戶給用戶給Age屬性所屬性所賦的值賦的值4 static void Main(string args) Student

3、s = new Student(); s.Age = 20; / 20傳值給傳值給value,執(zhí)行,執(zhí)行Age屬性的屬性的set訪問(wèn)器訪問(wèn)器 Console.WriteLine(s.Age); /執(zhí)行執(zhí)行Age屬性的屬性的get訪問(wèn)器,得到返回值訪問(wèn)器,得到返回值 示例5學(xué)生類(lèi)定義了一個(gè)學(xué)生類(lèi)定義了一個(gè)私有字段私有字段nAge,也定義了,也定義了公有屬公有屬性性Age,并包含,并包含get和和set兩個(gè)訪問(wèn)器,使其既可讀也兩個(gè)訪問(wèn)器,使其既可讀也可寫(xiě)。可寫(xiě)。在屬性的在屬性的get訪問(wèn)器中,用訪問(wèn)器中,用return來(lái)返回一個(gè)事物的來(lái)返回一個(gè)事物的屬性值。屬性值。在屬性的在屬性的set訪問(wèn)器中可

4、以使用一個(gè)特殊的訪問(wèn)器中可以使用一個(gè)特殊的隱含參數(shù)隱含參數(shù)value。該參數(shù)包含用戶指定的值,通常用在。該參數(shù)包含用戶指定的值,通常用在set訪問(wèn)訪問(wèn)器中,將用戶指定的值賦值到一個(gè)類(lèi)變量中。器中,將用戶指定的值賦值到一個(gè)類(lèi)變量中。如果沒(méi)有如果沒(méi)有set訪問(wèn)器,則表示屬性是只讀的;如果沒(méi)訪問(wèn)器,則表示屬性是只讀的;如果沒(méi)有有g(shù)et訪問(wèn)器則表示屬性是只寫(xiě)的。訪問(wèn)器則表示屬性是只寫(xiě)的。 示例說(shuō)明6 5.6 委托和事件q 委托,顧名思義,就是中間代理人的意思。q 通俗地說(shuō),委托是一個(gè)可以引用方法的對(duì)象,當(dāng)創(chuàng)建一個(gè)委托,也就創(chuàng)建一個(gè)引用方法的對(duì)象,進(jìn)而就可以調(diào)用那個(gè)方法,即委托可以調(diào)用它所指向的方法。q

5、 事件是建立在委托基礎(chǔ)上的另一個(gè)重要特性。從本質(zhì)上說(shuō),事件就是當(dāng)某個(gè)事情發(fā)生時(shí),會(huì)自動(dòng)去執(zhí)行一些語(yǔ)句。事件是特殊化的委托,委托是事件的基礎(chǔ)。7委托int Multiply(int,int).int Divide(int,int).在運(yùn)行時(shí)確定調(diào)用哪種方法委托和方法必須具有相同的參數(shù)-public delegate int Call(int num1, int num2);-8定義委托的關(guān)鍵語(yǔ)法定義委托類(lèi)型:委委托名托名 委托實(shí)例名委托實(shí)例名; 委托實(shí)例名聲明委托對(duì)象:創(chuàng)建委托對(duì)象:(確定與哪些方法進(jìn)行綁定)9委托 示例1using System;/ 委托定義class Math/ 乘法方法pu

6、blic int Multiply(int num1, int num2)return num1*num2;/ 除法方法public int Divide(int num1, int num2)return num1/num2;class Test static void Main(string args) / Math 類(lèi)的對(duì)象Math objMath = new Math(); / 委托的對(duì)象/ 將方法與委托關(guān)聯(lián)起來(lái)/ 調(diào)用委托實(shí)例result = System.Console.WriteLine(結(jié)果為 0, result); 將方法與委托關(guān)聯(lián)起來(lái)10定義委托使用關(guān)鍵字delegate:

7、再實(shí)例化: 最后調(diào)用:相當(dāng)于調(diào)用相當(dāng)于調(diào)用objMath.Multiply(5,3);委托可以調(diào)用多個(gè)方法,稱(chēng)為多播,使用+和-運(yùn)算實(shí)現(xiàn)方法的增加和減少。如,在上例基礎(chǔ)上添加如下代碼:Call d= new Call(objMath.Divide);objCall += d;objCall(5,3);則運(yùn)行時(shí),先調(diào)用則運(yùn)行時(shí),先調(diào)用objMath.Multiply(5,3); 再調(diào)用再調(diào)用objMath.Divide(5,3);理解多播11定義委托的步驟1 聲明一個(gè)委托,其參數(shù)形式一定要和你想要包含的方法的參數(shù)形式聲明一個(gè)委托,其參數(shù)形式一定要和你想要包含的方法的參數(shù)形式一致。一致。publi

8、c delegate void MyDelegate(參數(shù));參數(shù)); 2 定義所有你要定義的方法,其參數(shù)形式和第一步中聲明的委托對(duì)象定義所有你要定義的方法,其參數(shù)形式和第一步中聲明的委托對(duì)象的參數(shù)形式必須相同。的參數(shù)形式必須相同。 Method(參數(shù));(參數(shù));【參數(shù)要一致】【參數(shù)要一致】3 創(chuàng)建委托對(duì)象并將所希望的方法包含在該委托對(duì)象中。創(chuàng)建委托對(duì)象并將所希望的方法包含在該委托對(duì)象中。 MyDelegate objMyDelegate = new MyDelegate(類(lèi)類(lèi)1.Method1);objMyDelegate += new MyDelegate(類(lèi)類(lèi)2.Method2);4

9、通過(guò)委托對(duì)象調(diào)用包含在其中的各個(gè)方法。通過(guò)委托對(duì)象調(diào)用包含在其中的各個(gè)方法。 objMyDelegate(待傳入的參數(shù)待傳入的參數(shù));125.6.1 委托委托【例【例5-26】委托的使用。using System; namespace Example_Delegate delegate int MyDelegate();/第一步第一步:委托聲明委托聲明 delegate int NumOpe(int a, int b); /第一步第一步:委托聲明委托聲明 class MyClass public int M1() Console.WriteLine(調(diào)用的實(shí)例的方法調(diào)用的實(shí)例的方法); ret

10、urn 0; 135.6.1 委托委托 public static int M2() Console.WriteLine(調(diào)用的靜態(tài)的方法調(diào)用的靜態(tài)的方法); return 0; class clsAdd public int Add(int num1, int num2) return (num1 + num2); 145.6.1 委托委托 class Test static void Main() MyClass cls = new MyClass(); /委托實(shí)例化委托實(shí)例化,注意參數(shù)是要使用的方法名注意參數(shù)是要使用的方法名, /且不帶括號(hào)且不帶括號(hào) MyDelegate d = new

11、 MyDelegate(cls.M1); d(); /委托調(diào)用委托調(diào)用 d = new MyDelegate(MyClass.M2); d(); /委托調(diào)用委托調(diào)用 clsAdd add = new clsAdd(); NumOpe p = new NumOpe(add.Add); Console.WriteLine(p(1, 2); /委托調(diào)用委托調(diào)用 Console.ReadLine(); 程序的運(yùn)行結(jié)果如下:程序的運(yùn)行結(jié)果如下:調(diào)用的實(shí)例的方法調(diào)用的實(shí)例的方法調(diào)用的靜態(tài)的方法調(diào)用的靜態(tài)的方法3155.6.2 事件事件事件就是當(dāng)對(duì)象或類(lèi)狀態(tài)發(fā)生改變時(shí),對(duì)象或類(lèi)發(fā)出的信息事件就是當(dāng)對(duì)象或類(lèi)狀

12、態(tài)發(fā)生改變時(shí),對(duì)象或類(lèi)發(fā)出的信息或通知。或通知。發(fā)出信息的對(duì)象或類(lèi)稱(chēng)為發(fā)出信息的對(duì)象或類(lèi)稱(chēng)為“事件源事件源”,對(duì)事件進(jìn)行處理的方,對(duì)事件進(jìn)行處理的方法稱(chēng)為法稱(chēng)為“接收者接收者”,通常事件源在發(fā)出狀態(tài)改變信息時(shí),它,通常事件源在發(fā)出狀態(tài)改變信息時(shí),它并不知道由哪個(gè)事件接收者來(lái)處理。并不知道由哪個(gè)事件接收者來(lái)處理。這就需要一種管理機(jī)制來(lái)協(xié)調(diào)事件源和接收者,在這就需要一種管理機(jī)制來(lái)協(xié)調(diào)事件源和接收者,在C#中事中事件使用委托來(lái)為觸發(fā)時(shí)將調(diào)用的方法提供類(lèi)型安全的封裝。件使用委托來(lái)為觸發(fā)時(shí)將調(diào)用的方法提供類(lèi)型安全的封裝。事件處理要用委托來(lái)表示。事件處理要用委托來(lái)表示。事件16理解事件 圖示搶答者 宣布人

13、宣布人搶答者“請(qǐng)聽(tīng)題”集中注意力聆聽(tīng)其他人事件源事件的發(fā)布者事件的訂閱人未訂閱該事件 定義事件 為對(duì)象訂閱該事件 將發(fā)生的事件通知給訂閱人171. 事件的聲明事件的聲明事件是類(lèi)成員,以關(guān)鍵字事件是類(lèi)成員,以關(guān)鍵字event聲明。聲明。格式:格式:修飾符修飾符event 委托名委托名 事件名;事件名;事件實(shí)際就是一種特殊的委托對(duì)象。事件實(shí)際就是一種特殊的委托對(duì)象。例:例:delegate void MyEventHandler();事件的聲明為:事件的聲明為:class MyEventpublic event MyEventHandler active; /active就是一個(gè)事件名就是一個(gè)事件

14、名185.6.2 事件事件2. 事件的預(yù)訂與取消事件的預(yù)訂與取消事件的預(yù)訂就是向委托的調(diào)用列表中添加方法,是事件的預(yù)訂就是向委托的調(diào)用列表中添加方法,是通過(guò)事件加上運(yùn)算符通過(guò)事件加上運(yùn)算符+=來(lái)實(shí)現(xiàn)的。來(lái)實(shí)現(xiàn)的。格式:格式:事件名事件名 += new 委托名委托名(方法名方法名);例:例:MyEvent evt = new MyEvent(); evt.active += new MyEventHandler(handler);又例:又例:OkButton.Click += new EventHandler(OkButton.Click);這樣,只要事件被觸發(fā),所預(yù)定的方法就會(huì)被調(diào)用。這樣,只

15、要事件被觸發(fā),所預(yù)定的方法就會(huì)被調(diào)用。195.6.2 事件事件事件的撤銷(xiāo)則采用左運(yùn)算符事件的撤銷(xiāo)則采用左運(yùn)算符-=來(lái)實(shí)現(xiàn)。來(lái)實(shí)現(xiàn)。 事件名事件名 -= new 委托名委托名(方法名方法名);例:例:OkButton.Click-=new EventHandler(OkButton.Click);值得注意的是,在聲明事件的類(lèi)的外部,對(duì)于事件值得注意的是,在聲明事件的類(lèi)的外部,對(duì)于事件的操作只能用的操作只能用+=及及-=,而不能用其他任何的運(yùn)算符,而不能用其他任何的運(yùn)算符,如賦值如賦值“=”、判定是否為空、判定是否為空“=”等。但是聲明事件等。但是聲明事件的類(lèi)型的上下文中(即在所在類(lèi)的程序內(nèi)部),

16、用這的類(lèi)型的上下文中(即在所在類(lèi)的程序內(nèi)部),用這些運(yùn)算符是可以的。些運(yùn)算符是可以的。205.6.2 事件事件3. 事件的發(fā)生事件的發(fā)生事件的發(fā)生就是對(duì)事件相對(duì)應(yīng)的委托的調(diào)用,也就事件的發(fā)生就是對(duì)事件相對(duì)應(yīng)的委托的調(diào)用,也就是委托的調(diào)用列表中所包含的各個(gè)方法的調(diào)用。是委托的調(diào)用列表中所包含的各個(gè)方法的調(diào)用。格式:格式:事件名事件名(參數(shù)參數(shù));215.6.2 事件事件【例【例5-28】演示事件的聲明、事件的預(yù)訂及撤銷(xiāo)、事件的發(fā)生。using System; namespace Example_Event delegate void MyEventHandler();/為事件建立一個(gè)委托 cla

17、ss MyEvent public event MyEventHandler activate;/聲明一個(gè)事件 public void fire() /調(diào)用此方法來(lái)觸發(fā)事件 if (activate != null) activate();/事件發(fā)生 225.6.2 事件事件 class Test static void handler() Console.WriteLine(事件發(fā)生); static void Main() MyEvent evt = new MyEvent(); /把方法handler()添加到事件列表中 evt.activate += new MyEventHandle

18、r(handler); evt.fire(); /調(diào)用觸發(fā)事件的方法 23 假設(shè)我們有個(gè)高檔的熱水器,我們給它通上電,當(dāng)水溫假設(shè)我們有個(gè)高檔的熱水器,我們給它通上電,當(dāng)水溫超過(guò)超過(guò)95度的時(shí)候:度的時(shí)候:1、揚(yáng)聲器會(huì)開(kāi)始發(fā)出語(yǔ)音,告訴你水的、揚(yáng)聲器會(huì)開(kāi)始發(fā)出語(yǔ)音,告訴你水的溫度;溫度;2、液晶屏也會(huì)改變水溫的顯示,來(lái)提示水已經(jīng)快燒、液晶屏也會(huì)改變水溫的顯示,來(lái)提示水已經(jīng)快燒開(kāi)了開(kāi)了 class Heater private int temperature; / 水溫 / 燒水 public void BoilWater() for (int i = 0; i 95) MakeAlert(tem

19、perature); ShowMsg(temperature); 24 / 發(fā)出語(yǔ)音警報(bào) private void MakeAlert(int param) Console.WriteLine(“Alarm:嘀,水已經(jīng) 0 度了” , param); / 顯示水溫 private void ShowMsg(int param) Console.WriteLine(Display:水快開(kāi)了,當(dāng)前溫度:0度。 , param); class Program static void Main() Heater ht = new Heater(); ht.BoilWater(); 25q現(xiàn)在假設(shè)熱水器

20、由三部分組成:熱水器、警報(bào)器、顯示器,它們來(lái)自于不同廠商并進(jìn)行了組裝。那么,應(yīng)該是熱水器熱水器僅僅負(fù)責(zé)燒水,它不能發(fā)出警報(bào)也不能顯示水溫;在水燒開(kāi)時(shí)由警報(bào)器警報(bào)器發(fā)出警報(bào)、顯示顯示器器顯示提示和水溫。 26Observer設(shè)計(jì)模式中主要包括如下兩類(lèi)對(duì)象: Subject:監(jiān)視對(duì)象,它往往包含著其他對(duì)象所感興趣的內(nèi)容。在本范例中,熱水器就是一個(gè)監(jiān)視對(duì)象,它包含的其他對(duì)象所感興趣的內(nèi)容,就是temprature字段,當(dāng)這個(gè)字段的值快到100時(shí),會(huì)不斷把數(shù)據(jù)發(fā)給監(jiān)視它的對(duì)象。 Observer:監(jiān)視者,它監(jiān)視Subject,當(dāng)Subject中的某件事發(fā)生的時(shí)候,會(huì)告知Observer,而Observ

21、er則會(huì)采取相應(yīng)的行動(dòng)。在本范例中,Observer有警報(bào)器和顯示器,它們采取的行動(dòng)分別是發(fā)出警報(bào)和顯示水溫。27public class Heater private int temperature; public string type = “RealFire 001”; / 型號(hào) public string area = “China Xian”; / 產(chǎn)地 /聲明委托 public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e); public event BoiledEventHandler Boi

22、led; /聲明事件 / 定義BoiledEventArgs類(lèi),傳遞給Observer所感興趣的信息 public class BoiledEventArgs : EventArgs public readonly int temperature; public BoiledEventArgs(int temperature) this.temperature = temperature; 28 protected virtual void OnBoiled(BoiledEventArgs e) if (Boiled != null) / 如果有對(duì)象注冊(cè) Boiled(this, e); / 調(diào)用所有注冊(cè)對(duì)象的方法 / 燒水。 public void BoilWater() for (int i = 0; i 95) /建立BoiledEventArgs 對(duì)象。 BoiledEventArgs e = new BoiledEventArgs(temperature); OnBoiled(e); / 調(diào)用 OnBolied方法 29/ 警報(bào)器public class Alarm public void MakeAlert(Object sender, Heater.BoiledEventArgs e) Heater heater = (Heater)sende

溫馨提示

  • 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)論