




已閱讀5頁,還剩48頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章面向?qū)ο蟮母呒?jí)編程,封裝、繼承與多態(tài)版本控制接口委托泛型處理,本章教學(xué)目的介紹面向?qū)ο蟾呒?jí)編程的相關(guān)知識(shí),使學(xué)生對(duì)C#高級(jí)編程有一個(gè)感性認(rèn)識(shí)。本章教學(xué)要求(1)掌握繼承、泛型的概念及基本用法;(2)掌握與實(shí)驗(yàn)有關(guān)的相關(guān)內(nèi)容,包括封裝、繼承與多態(tài)、泛型處理;(3)了解其他內(nèi)容。,實(shí)驗(yàn)中的問題解答,如何添加某個(gè)事件(例如窗體的Shown事件)?如何刪除某個(gè)事件?答:添加和刪除事件均在設(shè)計(jì)視圖下利用屬性中的事件完成。使用textBoxStartAmount.Focus();與使用鍵讓某控件獲取焦點(diǎn)有何不同?答:前者用于動(dòng)態(tài)設(shè)置,后者用于靜態(tài)設(shè)置。實(shí)驗(yàn)2:privatedoubleCaculate(doublestartAmount,doublerate,intcount)疊加次數(shù)count是什么意思?答:疊加次數(shù)是指到期后將計(jì)算出來的利息作為存款再次計(jì)算,例如存款時(shí)間為1年,則按年算息疊加次數(shù)為1,按月算息疊加次數(shù)為12,按季度算息疊加次數(shù)為4。實(shí)驗(yàn)報(bào)告什么時(shí)候交?進(jìn)度如何安排?答:各人根據(jù)自己的情況安排進(jìn)度,完成一個(gè),寫一個(gè)實(shí)驗(yàn)報(bào)告。如何定義屬性?如何給屬性賦值?如何獲取屬性的值?答:見書上P59例3-10,4.1封裝、繼承與多態(tài),封裝:隱藏調(diào)用者不需要了解的信息。繼承:簡(jiǎn)化類的設(shè)計(jì)。多態(tài):類為名稱相同的方法提供不同實(shí)現(xiàn)方式的能力。,封裝,模塊信息通過類封裝類的成員通過字段、屬性、方法、事件封裝私有的用private可以被繼承的用protected公共成員用public不要為了方便把什么都定義成public不要為了方便把什么都定義成static通過屬性進(jìn)行封裝的例子:P73例4-1,封裝舉例:,對(duì)象封裝了對(duì)象的數(shù)據(jù)以及對(duì)這些數(shù)據(jù)的操作。對(duì)象是屬性和操作的組合對(duì)象的表現(xiàn)(服務(wù)、接口)和實(shí)現(xiàn)細(xì)節(jié)分開,/MyClass.csusingSystem;namespaceConsoleTestclassMyClassprivateintnumber;publicintNumbergetreturnnumber;setif(value0)number=value;,/Program.csusingSystem;namespaceConsoleTestpublicclassProgrampublicstaticvoidMain()MyClassme=newMyClass();me.Number=-1;Console.WriteLine(Number:0,me.Number);Console.ReadLine();回答:Number輸出的值是多少?,練習(xí)(1),Question47.(單選)InObjectorientedProgramming,howwouldyoudescribeencapsulation?1.Theconversionofonetypeofobjecttoanother.2.Theruntimeresolutionofmethodcalls.3.Theexpositionofdata.4.Theseparationofinterfaceandimplementation.答案:4,繼承,繼承表示現(xiàn)實(shí)世界中遺傳關(guān)系的直接模擬。它表示類之間的內(nèi)在聯(lián)系以及對(duì)屬性和操作的共享。,繼承(續(xù)),聲明擴(kuò)充類的語法:訪問修飾符class擴(kuò)充類名稱:基類名稱/程序代碼擴(kuò)充類繼承了所有定義在基類中數(shù)據(jù)的定義和方法。但是擴(kuò)充類不繼承基類的構(gòu)造函數(shù)。繼承的例子(1):P76例4-2,兩種實(shí)現(xiàn)繼承的方式:類繼承和接口繼承。類繼承只允許單一繼承,接口可實(shí)現(xiàn)多重繼承。被繼承的類叫基類繼承自其他類的類叫擴(kuò)充類,多態(tài),用相同的操作名在一個(gè)類層次的不同類中實(shí)現(xiàn)不同的功能,相同的消息由同一(父)類的不同對(duì)象接收時(shí),導(dǎo)致不同的行為。舉例:幾何圖形類層次中的多態(tài)性。其派生類“圓”、“長(zhǎng)方形”、“三角形”等都有方法“求面積”。,幾何圖形,圓,三角形,幾何圖形,圓,Shape類GetArea(),Rectangle類GetArea(),Circle類GetArea(),Triangle類GetArea(),1、虛擬方法在基類中,如果想讓某個(gè)方法或者事件被擴(kuò)充類重寫,可以使用修飾符virtual表明:publicvirtualvoidmyMethod()/程序代碼擴(kuò)充類則用override重寫:publicoverridevoidmyMethod()/程序代碼,多態(tài)(續(xù)),/MyClass.csusingSystem;namespaceConsoleTestclassMyClasspublicvirtualvoidHello()Console.WriteLine(123);,/MyNewClass.csusingSystem;namespaceConsoleTestclassMyNewClass:MyClassprivatestringstr=hello;publicoverridevoidHello()Number=2;Console.WriteLine(str);,多態(tài)(續(xù)),使用虛擬方法和重寫方法時(shí),要注意下面幾個(gè)方面:虛擬方法不能聲明為靜態(tài)的。Virtual不能和private一起使用。重寫方法的名稱、參數(shù)個(gè)數(shù)、類型以及返回值都必須和虛擬方法的一致。舉例P79頁例4-4,多態(tài)(續(xù)),2、隱藏基類的方法在擴(kuò)充類中,可以使用new關(guān)鍵字來隱藏基類的方法,即使用一個(gè)完全不同的方法取代舊的方法。與方法重寫不同的是,使用new關(guān)鍵字時(shí)并不要求基類中的方法聲明為virtual,只要在擴(kuò)充類的方法前聲明為new,就可以隱藏基類的方法。,多態(tài)(續(xù)),3、抽象類使用abstract修飾符。抽象類只能做基類。抽象類與非抽象類的區(qū)別:第一是抽象類不能直接被實(shí)例化,只能在擴(kuò)充類中通過繼承使用,對(duì)抽象類使用new運(yùn)算符會(huì)產(chǎn)生編譯時(shí)錯(cuò)誤第二個(gè)不同點(diǎn)是抽象類可以包含抽象成員,而非抽象類不能包含抽象成員。當(dāng)從抽象類派生非抽象類時(shí),這些非抽象類必須具體實(shí)現(xiàn)所繼承的所有抽象成員。,補(bǔ)充題目,Question32.(單選)以下描述錯(cuò)誤的是()1.在C+中支持抽象類而在C#中不支持抽象類。2.C+中可在頭文件中聲明類的成員而在CPP文件中定義類的成員,在C#中沒有頭文件并且在同一處聲明和定義類的成員。3.在C#中可使用new修飾符顯式隱藏從基類繼承的成員。4.在C#中要在派生類中重新定義基類的虛函數(shù)必須在前面加Override。,練習(xí)(2),abstractclassBaseClasspublicvirtualvoidMethodA()Console.WriteLine(BaseClass);classClass1:BaseClasspublicvoidMethodA()Console.WriteLine(Class1);classClass2:Class1在Main方法中執(zhí)行下列語句:Class2o=newClass2();o.MethodA();問:執(zhí)行結(jié)果是什么?,4.2版本控制,用C#編寫方法時(shí),如果在擴(kuò)充類中重寫基類的方法,需要用override聲明;要隱藏基類的方法,需要用new聲明,這就是C#進(jìn)行版本控制的依據(jù)。調(diào)用非虛擬方法時(shí)不會(huì)受到版本的影響調(diào)用虛擬方法的實(shí)現(xiàn)部分可能會(huì)因擴(kuò)充類的重寫而影響執(zhí)行結(jié)果。舉例:P83例4-8P84例4-9,4.2版本控制(續(xù)),調(diào)用原則:調(diào)用繼承的最后實(shí)現(xiàn)部分的方法P85例4-10C#允許派生類包含與基類方法名稱相同的方法,規(guī)則如下:1)基類方法必須聲明為virtual2)若派生類中方法前無new或override關(guān)鍵字,方法執(zhí)行按存在new關(guān)鍵字一樣執(zhí)行3)若派生類中方法前帶new關(guān)鍵字,則此方法被定義為獨(dú)立于基類的方法4)若派生類中方法前帶override關(guān)鍵字,則派生類調(diào)用此方法,而非基類的方法。5)可從派生類中使用base關(guān)鍵字調(diào)用基類方法。,補(bǔ)充知識(shí):C#面試題,publicclassApublicA()Console.WriteLine(“A”);publicvirtualvoidFun()Console.WriteLine(A.Fun();,publicclassB:ApublicB()Console.WriteLine(“B”);publicnewvoidFun()Console.WriteLine(B.Fun();publicstaticvoidMain()Aa=newB();a.Fun();/輸出結(jié)果為:ABA.Fun(),4.3接口,接口的主要特點(diǎn)是只有聲明部分,沒有實(shí)現(xiàn)部分。接口成員的實(shí)現(xiàn)是通過類完成的。定義在接口中的方法都是public的。使用interface關(guān)鍵字聲明一個(gè)接口。常用的語法是:訪問修飾符interface接口名稱/接口體一般情況下,以大寫的“I”開頭指定接口名,表明這是一個(gè)接口。需要在不相關(guān)的類中實(shí)現(xiàn)同樣的功能時(shí),可以使用接口。,4.3接口,P88例4-11顯示方式實(shí)現(xiàn)接口例4-12注意:顯示實(shí)現(xiàn)接口時(shí),不能通過類的實(shí)例進(jìn)行訪問,而必須使用接口實(shí)例。通過接口實(shí)現(xiàn)多繼承例4-13,補(bǔ)充知識(shí):C#面試題,不定項(xiàng)選擇題以下敘述正確的是:A.接口中可以有虛方法。B.一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。C.接口不能被實(shí)例化。D.接口中可以包含已實(shí)現(xiàn)的方法。B、C(2)以下敘述正確的是:A.接口和抽象類一樣均只能聲明,而不能有實(shí)現(xiàn)部分。B.類可以繼承多個(gè)接口,但僅能從一個(gè)抽象類或其它類型的單個(gè)類繼承。C.接口中可以定義屬性、方法和事件,但只聲明不實(shí)現(xiàn)。D.類的多繼承可以通過接口實(shí)現(xiàn)。B、C、D,4.4委托,類似與C+中的函數(shù)指針,但有很大不同委托的聲明例如:publicdelegatevoidFuncDelegate(stringstr);委托的使用具體內(nèi)容不再詳細(xì)講述,4.5序列化與反序列化,序列化獲取對(duì)象并將其狀態(tài)信息轉(zhuǎn)換為可存儲(chǔ)或可傳輸形式的過程。反序列化將對(duì)象還原回序列化之前的內(nèi)容。序列化和反序列化是一個(gè)互逆的過程。.NETFramework提供的兩種序列化技術(shù)二進(jìn)制序列化XML和SOAP序列化,4.5序列化與反序列化,1、如何序列化一個(gè)類:在類的上方加上Serializable特性即可。SerializablepublicclassMyClass2、二進(jìn)制序列化MyClassuser=newMyClass();IFormatterformater=newBinaryFormatter();Streamstream=newFileStream(UserInfo.bin,FileMode.Create,FileAccess.Write,FileShare.None);formater.Serialize(stream,user);stream.Close();特點(diǎn):二進(jìn)制序列化會(huì)將一個(gè)類的所有成員變量都進(jìn)行序列化,包括私有變量、公共屬性、方法等。,4.5序列化與反序列化,3、二進(jìn)制反序列化IFormatterformatter=newBinaryFormatter();Streamstream=newFileStream(UserInfo.bin,FileMode.Open,FileAccess.Read,FileShare.Read);MyClassc=(MyClass)formatter.Deserialize(stream);stream.Close();特點(diǎn):反序列化后,對(duì)象c與序列化之前的狀態(tài)完全相同。,補(bǔ)充:二進(jìn)制序列化與反序列化舉例,保存窗體位置、顏色與數(shù)據(jù)庫連接信息設(shè)置,補(bǔ)充:二進(jìn)制序列化與反序列化舉例,當(dāng)輸入服務(wù)器等信息、改變窗體前景色、位置后,退出應(yīng)用程序,再次啟動(dòng),可看到仍然是退出前的狀態(tài)。,4.5序列化與反序列化,4、XML序列化(1)XML序列化僅將對(duì)象的公共字段和屬性值序列化為XML流,而不轉(zhuǎn)換方法、索引器、私有字段或只讀屬性(只讀集合除外)。(2)XML序列化不包括類型信息,即不能保證序列化后的對(duì)象在被反序列化時(shí),變?yōu)橥活愋偷膶?duì)象。(3)XML序列化的實(shí)現(xiàn)步驟Class1user=newClass1();user.AccountName=aa;XmlSerializermySerializer=newXmlSerializer(typeof(Class1);StreamWritermyWriter=newStreamWriter(UserInfo.xml);mySerializer.Serialize(myWriter,user);myWriter.Close();,4.5序列化與反序列化,(4)XML反序列化的步驟Class1c;XmlSerializermySerializer=newXmlSerializer(typeof(Class1);FileStreammyFileStream=newFileStream(UserInfo.xml,FileMode.Open);c=(Class1)mySerializer.Deserialize(myFileStream);myFileStream.Close();注意:反序列化一個(gè)對(duì)象時(shí)不會(huì)調(diào)用構(gòu)造函數(shù),這一點(diǎn)與創(chuàng)建對(duì)象不同。,4.6泛型處理,泛型(Generic)一般用在集合和在集合上運(yùn)行的方法中。.NET框架2.0以前的版本不支持泛型。使用泛型具有以下明顯的優(yōu)點(diǎn):1)可以避免以下兩個(gè)問題:內(nèi)部實(shí)現(xiàn)代碼冗余和困擾開發(fā)人員的含混不清的編譯器錯(cuò)誤提示;2)類型安全;3)二進(jìn)制代碼重用;4)性能;5)清晰性。,4.6泛型問題描述,publicclassStackobjectm_Items;publicvoidPush(objectitem).publicobjectPop().使用舉例:Stackstack=newStack();stack.Push(1);intnumber=(int)stack.Pop();stack.Push(“str”);stringstr=(string)stack.Pop();,基于Object的堆棧缺點(diǎn),性能問題值類型需頻繁地裝箱、拆箱,造成較多的垃圾碎片,增加垃圾回收的負(fù)擔(dān)引用類型需要強(qiáng)制類型轉(zhuǎn)換類型安全問題(更嚴(yán)重)編譯時(shí)任務(wù)類型都轉(zhuǎn)換成object,無法保證運(yùn)行時(shí)類型安全。例如:Stackstack=newStack();stack.Push(“abc”);intnumber=(int)stack.Pop();,4.6泛型解決辦法,publicclassIntStackintm_Items;publicvoidPush(intitem).publicintPop().,publicclassStringStackstringm_Items;publicvoidPush(stringitem).publicstringPop().,功能相似,代碼冗余!維護(hù)麻煩!,基于Object的堆棧,IntStackStringStack,代碼冗余,維護(hù)復(fù)雜,工作效率低,性能問題、類型安全問題,有沒有好的解決辦法?,有,泛型,解決方法采用泛型,publicclassStackTm_Items;publicvoidPush(Titem).publicTPop().,泛型是如何實(shí)現(xiàn)的?,在.NET2.0中,泛型在IL(中間語言)和CLR本身中具有本機(jī)支持編譯泛型時(shí),就像編譯類一樣,泛型僅保留一個(gè)占位符。而用特定類型實(shí)例化的泛型代碼,編譯時(shí)會(huì)將泛型替換為實(shí)例化的特定類型。,泛型實(shí)現(xiàn),publicclassStackTm_Items;publicvoidPush(Titem).publicTPop().使用舉例:Stackstack=newStackstack.Push(1);intnumber=stack.Pop();,泛型的定義和引用,泛型定義代碼語法如下:訪問修飾符返回類型泛型支持類型泛型名稱其中CLR支持的泛型類、結(jié)構(gòu)、方法、接口和委托等。泛型類定義舉例:classNodeTdata;Nodenext;例4-19引用泛型類,泛型的引用,泛型類定義舉例:voidSwap(refTitem1,refTitem2)Ttemp=item1;item1=item2;item2=temp;例4-20引用一個(gè)泛型方法程序舉例:使用泛型方法來實(shí)現(xiàn)int、double、float類型的數(shù)據(jù)交換方法。,常用泛型,凡是有對(duì)應(yīng)泛型類型的類就盡量不要使用早期提供的非泛型類型的類。下面的泛型類型對(duì)應(yīng)于低版本提供的類型:泛型類低版本提供的非泛型類ListArrayListDictionaryHashtableQueueQueueStackStackSortedListSortedList,實(shí)驗(yàn)中用到的泛型,SortedList:按鍵排序的鍵值對(duì)集合,是運(yùn)算復(fù)雜度為O(logn)的二進(jìn)制搜索樹。常用方法:Add方法:將帶有指定鍵和值的元素添加到SortedList中例如(注意:如果插入重復(fù)的鍵會(huì)產(chǎn)生異常):SortedListopenWith=newSortedList();openWith.Add(txt,notepad.exe);openWith.Add(bmp,paint.exe);,實(shí)驗(yàn)中用到的泛型(續(xù)),如何遍歷泛型列表中的每個(gè)鍵值對(duì)SortedListlist=newSortedList();list.Add(a,123);list.Add(b,234);list.Add(c,456);foreach(stringstrinlist.Keys)Console.WriteLine(keyis:+str+,valueis:+liststr.ToString();,實(shí)驗(yàn)中用到的泛型(續(xù)),TryGetValue方法:獲取與指定的鍵相關(guān)聯(lián)的值。例如:stringvalue=;if(openWith.TryGetValue(tif,outvalue)Console.WriteLine(Forkey=tif,value=0.,value);elseConsole.WriteLine(Key=tifisnotfound.);,實(shí)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《中國(guó)機(jī)長(zhǎng)》觀后感15篇
- “六一”兒童節(jié)活動(dòng)總結(jié)
- 金剛石產(chǎn)業(yè)園項(xiàng)目建議書(模板)
- 供水老舊管網(wǎng)改造項(xiàng)目實(shí)施方案(范文模板)
- 心理測(cè)驗(yàn)技能教學(xué)課件
- 端午班級(jí)活動(dòng)課件
- 廚房用品設(shè)計(jì)調(diào)研作業(yè)
- 廣西藍(lán)天航空職業(yè)學(xué)院《工程監(jiān)理》2023-2024學(xué)年第二學(xué)期期末試卷
- 西昌學(xué)院《課堂組織與管理》2023-2024學(xué)年第二學(xué)期期末試卷
- 桂林醫(yī)學(xué)院《綠色建筑與綠色施工》2023-2024學(xué)年第二學(xué)期期末試卷
- 鹵味學(xué)員合同協(xié)議書
- 2025年健康管理師職業(yè)技能考試筆試試題(100題)含答案
- 消防文職考試試題及答案
- 2025年企業(yè)管理專業(yè)考試試題及答案詳解
- 蘇科版七年級(jí)數(shù)學(xué)下冊(cè)《第十一章一元一次不等式》單元測(cè)試卷含答案
- 2024年甘肅蘭州事業(yè)單位考試真題
- 小學(xué)語文古詩詞教學(xué)策略探究
- 2025年4月《粉塵涉爆重大事故隱患解讀》應(yīng)急部
- 四川省綿陽市2025屆高三下學(xué)期第三次診斷性測(cè)試數(shù)學(xué)試卷(含答案)
- 智能界面布局研究-全面剖析
- 課題申報(bào)書:數(shù)智融合驅(qū)動(dòng)高校教師數(shù)字素養(yǎng)提升路徑研究
評(píng)論
0/150
提交評(píng)論