版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第5章 面向?qū)ο蟮母呒?jí)編程,5.1 類的繼承與多態(tài)性5.2 版本控制5.3 接口 5.4 委托和事件5.5 反射5.6 序列化與反序列化,5.1 類的繼承與多態(tài)性,封裝:隱藏調(diào)用者不需要了解的信息。繼承:簡(jiǎn)化類的設(shè)計(jì)。多態(tài):類為名稱相同的方法提供不同實(shí)現(xiàn)方式的能力。,5.1.1 基類和擴(kuò)充類,繼承表示現(xiàn)實(shí)世界中遺傳關(guān)系的直接模擬。 它表示類之間的內(nèi)在聯(lián)系以及對(duì)屬性和操作的共享。,5.1.1 基類和擴(kuò)充類,聲明擴(kuò)充類的
2、語(yǔ)法: [訪問修飾符] class 擴(kuò)充類名稱:基類名稱 { //程序代碼 } 擴(kuò)充類繼承了所有定義在基類中數(shù)據(jù)的定義和方法。但是擴(kuò)充類不繼承基類的構(gòu)造函數(shù)。,兩種實(shí)現(xiàn)繼承的方式:類繼承和接口繼承。類繼承只允許單一繼承 ,接口可實(shí)現(xiàn)多重繼承。被繼承的類叫基類繼承自其他類的類叫擴(kuò)充類,5.1.1 基類和擴(kuò)充類,【例5-1】基類和擴(kuò)充類的定義及用法。,5.1.2 多態(tài)性,多態(tài)性是
3、指對(duì)象可以表示多個(gè)類型的能力。在C#中,多態(tài)性的定義是:同一操作作用于不同的類的實(shí)例,不同的類將進(jìn)行不同的解釋,最后產(chǎn)生不同的執(zhí)行結(jié)果。3種實(shí)現(xiàn)多態(tài)性的方法:通過(guò)繼承實(shí)現(xiàn)多態(tài)性。通過(guò)抽象類實(shí)現(xiàn)多態(tài)性。通過(guò)接口實(shí)現(xiàn)多態(tài)性。,5.1.2 多態(tài)性,1、虛擬方法 在基類中,如果想讓某個(gè)方法或者事件被擴(kuò)充類重寫,可以使用修飾符virtual表明: public virtual void myMethod() {
4、 ……//程序代碼 } 擴(kuò)充類則用override重寫: public override void myMethod() { ……//程序代碼 },5.1.2 多態(tài)(續(xù)),使用虛擬方法和重寫方法時(shí),要注意下面幾個(gè)方面:虛擬方法不能聲明為靜態(tài)的。Virtual不能和private一起使用。重寫方法的名稱、參數(shù)個(gè)數(shù)、類型以及返回值都必須和虛擬方法的一致。,5.1.2 多態(tài)(續(xù)),【例5-2】重寫
5、基類的方法。,5.1.2 多態(tài)(續(xù)),2、隱藏基類的方法 在擴(kuò)充類中,可以使用new關(guān)鍵字來(lái)隱藏基類的方法,即使用一個(gè)完全不同的方法取代舊的方法。 與方法重寫不同的是,使用new關(guān)鍵字時(shí)并不要求基類中的方法聲明為virtual,只要在擴(kuò)充類的方法前聲明為new,就可以隱藏基類的方法。3.在擴(kuò)充類直接調(diào)用基類的方法 使用base關(guān)鍵字,5.1.2 多態(tài)(續(xù)),【例5-3】隱藏基類的方法。,5.1.3 抽象類,使
6、用abstract修飾符。抽象類只能做基類。抽象類與非抽象類的區(qū)別:第一是抽象類不能直接被實(shí)例化,只能在擴(kuò)充類中通過(guò)繼承使用,對(duì)抽象類使用new運(yùn)算符會(huì)產(chǎn)生編譯時(shí)錯(cuò)誤。第二個(gè)不同點(diǎn)是抽象類可以包含抽象成員,而非抽象類不能包含抽象成員。當(dāng)從抽象類派生非抽象類時(shí),這些非抽象類必須具體實(shí)現(xiàn)所繼承的所有抽象成員。,5.1.4 密封類,密封類是指不能被其他類繼承的類。在C#語(yǔ)言中,使用sealed關(guān)鍵字聲明密封類。sealed關(guān)鍵字也
7、可以限制基類中的方法,防止被擴(kuò)充類重寫,帶有sealed修飾符的方法稱為密封方法。密封方法同樣不能被擴(kuò)充類中的方法繼承,也不能被隱藏。,5.1.5 繼承過(guò)程中構(gòu)造函數(shù)的處理,C#在內(nèi)部按照下列順序處理構(gòu)造函數(shù):從擴(kuò)充類依次向上尋找其基類,直到找到最初的基類,然后開始執(zhí)行最初的基類的構(gòu)造函數(shù),再依次向下執(zhí)行擴(kuò)充類的構(gòu)造函數(shù),直至執(zhí)行完最終的擴(kuò)充類的構(gòu)造函數(shù)為止。注意:對(duì)于無(wú)參數(shù)的構(gòu)造函數(shù),執(zhí)行不會(huì)出現(xiàn)問題。如果是帶參數(shù)的構(gòu)造函數(shù),還需要
8、做相應(yīng)的處理。,5.1.5 繼承過(guò)程中構(gòu)造函數(shù)的處理,【例5-5】繼承機(jī)制中構(gòu)造函數(shù)的用法。,5.2 版本控制,用C#編寫方法時(shí),如果在擴(kuò)充類中重寫基類的方法,需要用override聲明;要隱藏基類的方法,需要用new聲明,這就是C#進(jìn)行版本控制的依據(jù)。調(diào)用非虛擬方法時(shí)不會(huì)受到版本的影響調(diào)用虛擬方法的實(shí)現(xiàn)部分可能會(huì)因擴(kuò)充類的重寫而影響執(zhí)行結(jié)果。,5.2 版本控制,【例5-6】使用virtual、new與override進(jìn)行版本控
9、制。,5.3 接口,接口的主要特點(diǎn)是只有聲明部分,沒有實(shí)現(xiàn)部分。接口成員的實(shí)現(xiàn)是通過(guò)類完成的。 定義在接口中的方法都是public的。使用interface關(guān)鍵字聲明一個(gè)接口。常用的語(yǔ)法是: [訪問修飾符] interface 接口名稱 { // 接口體 } 一般情況下,以大寫的“I”開頭指定接口名,表明這是一個(gè)接口。需要在不相關(guān)的類中實(shí)現(xiàn)同樣的功能時(shí),可以使
10、用接口。,5.3 接口,1.接口的聲明與實(shí)現(xiàn)【例5-7】接口的聲明與實(shí)現(xiàn)。,5.3 接口,2.顯示方式實(shí)現(xiàn)接口注意:顯示實(shí)現(xiàn)接口時(shí),不能通過(guò)類的實(shí)例進(jìn)行訪問,而必須使用接口實(shí)例?!纠?-8】以顯式方式實(shí)現(xiàn)接口。,5.4 委托和事件,1.委托類似與C++中的函數(shù)指針,不同的是C++語(yǔ)言的函數(shù)指針只能夠指向靜態(tài)的方法,而委托除了可以指向靜態(tài)的方法之外,還可以指向?qū)ο髮?shí)例的方法。委托的最大特點(diǎn)是:它不知道或不關(guān)心自己引用的對(duì)象的類。
11、委托的應(yīng)用:回調(diào)(CallBack)機(jī)制、事件處理。委托的聲明和使用 例如: public delegate void FuncDelegate(string str);,委托舉例,【例5-9】委托的用法。,5.4 委托和事件,2.事件事件是響應(yīng)用戶對(duì)鼠標(biāo)、鍵盤操作或自動(dòng)執(zhí)行某個(gè)與事件關(guān)聯(lián)的方法的行為。事件和方法一樣具有簽名,簽名包括名稱和參數(shù)列表。事件的簽名通過(guò)委托類型來(lái)定義,為事件定義委托的常用形式為: p
12、ublic delegate MyEventHandler(Object sender, EventArgs e)事件可以使用event關(guān)鍵字進(jìn)行聲明,例如: public event MyEventHandler TriggerIt; 若要引發(fā)該事件,可以定義引發(fā)該事件時(shí)要調(diào)用的方法,如下例所示: public void Trigger( ) {TriggerIt( );}可以通過(guò)“+=”和“-=”運(yùn)算符向事件
13、添加委托來(lái)訂閱或取消對(duì)應(yīng)的事件。,事件舉例,【例5-10】事件的定義和調(diào)用方法。,5.5 反射,反射的用途是在程序或裝配件中查找有關(guān)類型的信息,或者從裝配件中讀取元數(shù)據(jù)。反射包含的大多數(shù)類都在System.Reflection命名空間中。常用的類:1.Type類:查找有關(guān)類型的相關(guān)信息。獲取指向給定類型的Type對(duì)象有2種常用方式:(1)使用C#提供的typeof關(guān)鍵字獲取指定類型的Type對(duì)象,例如:Type t = typ
14、eof(double);(2)調(diào)用Type類的GetType靜態(tài)方法。 例如:Type t = Type.GetType("System.Double")。2.Assembly類在System.Reflection命名空間中定義,它允許程序員訪問給定裝配件的元數(shù)據(jù)。,5.6 序列化與反序列化,序列化 獲取對(duì)象并將其狀態(tài)信息轉(zhuǎn)換為可存儲(chǔ)或可傳輸形式的過(guò)程。 反序列化 將對(duì)象還原回序列化之前的內(nèi)容。
15、序列化和反序列化是一個(gè)互逆的過(guò)程。.NET Framework提供的兩種序列化技術(shù)二進(jìn)制序列化:可以保持類型不變,即可以在應(yīng)用程序的不同調(diào)用之間保留對(duì)象的狀態(tài)。XML和SOAP序列化:僅序列化公共屬性和字段,不保存類型。,5.6 序列化與反序列化,1、如何序列化一個(gè)類:在類的上方加上Serializable特性即可。 [Serializable] public class MyClass { }
16、2、二進(jìn)制序列化 MyClass user = new MyClass(); …… IFormatter formater = new BinaryFormatter(); Stream stream = new FileStream("UserInfo.bin", FileMode.Create, FileAccess.Write, FileShare.None); formate
17、r.Serialize(stream, user); stream.Close(); 特點(diǎn): 二進(jìn)制序列化會(huì)將一個(gè)類的所有成員變量都進(jìn)行序列化,包括私有變量、公共屬性、方法等。,5.6 序列化與反序列化,3、二進(jìn)制反序列化 IFormatter formatter = new BinaryFormatter(); Stream stream = new FileStream("UserInfo.bin&qu
18、ot;, FileMode.Open, FileAccess.Read, FileShare.Read); MyClass c = (MyClass)formatter.Deserialize(stream); stream.Close();特點(diǎn):反序列化后,對(duì)象c與序列化之前的狀態(tài)完全相同。,5.6 序列化與反序列化,4、XML序列化(1)XML 序列化僅將對(duì)象的公共字段和屬性值序列化為XML流,而不轉(zhuǎn)換方法、
19、索引器、私有字段或只讀屬性(只讀集合除外)。 (2)XML 序列化不包括類型信息,即不能保證序列化后的對(duì)象在被反序列化時(shí),變?yōu)橥活愋偷膶?duì)象。 (3)XML序列化的實(shí)現(xiàn)步驟Class1 user = new Class1();user.AccountName = "aa";XmlSerializer mySerializer = new XmlSerializer(typeof(Class1));Stre
20、amWriter myWriter = new StreamWriter("UserInfo.xml");mySerializer.Serialize(myWriter, user);myWriter.Close();,5.6 序列化與反序列化,(4)XML反序列化的步驟Class1 c;XmlSerializer mySerializer = new XmlSerializer(typeof(Class1)
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 面向?qū)ο蠛兔嫦驅(qū)ο蟮母呒?jí)概念
- 面向?qū)ο笈c圖形編程
- java的面向?qū)ο缶幊?-------課堂筆記
- 基于.net 4面向?qū)ο缶幊谈呒?jí)主題(一)類的繼承與方法重寫
- java的面向?qū)ο缶幊掏馕馁Y料翻譯
- 標(biāo)準(zhǔn)C的面向?qū)ο缶幊棠芰U(kuò)展.pdf
- 《易飛揚(yáng)面向?qū)ο缶幊獭返?版
- 面向?qū)ο缶幊碳夹g(shù)作業(yè)題
- java面向?qū)ο缶幊叹毩?xí)題答案
- 05_面向?qū)ο蟾呒?jí)特性一
- 05_面向?qū)ο蟾呒?jí)特性一
- java-面向?qū)ο蟾呒?jí)程序設(shè)計(jì)
- 面向?qū)ο缶幊淘谌S游戲引擎開發(fā)中的應(yīng)用.pdf
評(píng)論
0/150
提交評(píng)論