




已閱讀5頁,還剩48頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第4章面向?qū)ο蟮母呒壘幊?封裝、繼承與多態(tài)版本控制接口委托泛型處理,本章教學目的介紹面向?qū)ο蟾呒壘幊痰南嚓P(guān)知識,使學生對C#高級編程有一個感性認識。本章教學要求(1)掌握繼承、泛型的概念及基本用法;(2)掌握與實驗有關(guān)的相關(guān)內(nèi)容,包括封裝、繼承與多態(tài)、泛型處理;(3)了解其他內(nèi)容。,實驗中的問題解答,如何添加某個事件(例如窗體的Shown事件)?如何刪除某個事件?答:添加和刪除事件均在設(shè)計視圖下利用屬性中的事件完成。使用textBoxStartAmount.Focus();與使用鍵讓某控件獲取焦點有何不同?答:前者用于動態(tài)設(shè)置,后者用于靜態(tài)設(shè)置。實驗2:privatedoubleCaculate(doublestartAmount,doublerate,intcount)疊加次數(shù)count是什么意思?答:疊加次數(shù)是指到期后將計算出來的利息作為存款再次計算,例如存款時間為1年,則按年算息疊加次數(shù)為1,按月算息疊加次數(shù)為12,按季度算息疊加次數(shù)為4。實驗報告什么時候交?進度如何安排?答:各人根據(jù)自己的情況安排進度,完成一個,寫一個實驗報告。如何定義屬性?如何給屬性賦值?如何獲取屬性的值?答:見書上P59例3-10,4.1封裝、繼承與多態(tài),封裝:隱藏調(diào)用者不需要了解的信息。繼承:簡化類的設(shè)計。多態(tài):類為名稱相同的方法提供不同實現(xiàn)方式的能力。,封裝,模塊信息通過類封裝類的成員通過字段、屬性、方法、事件封裝私有的用private可以被繼承的用protected公共成員用public不要為了方便把什么都定義成public不要為了方便把什么都定義成static通過屬性進行封裝的例子:P73例4-1,封裝舉例:,對象封裝了對象的數(shù)據(jù)以及對這些數(shù)據(jù)的操作。對象是屬性和操作的組合對象的表現(xiàn)(服務(wù)、接口)和實現(xiàn)細節(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輸出的值是多少?,練習(1),Question47.(單選)InObjectorientedProgramming,howwouldyoudescribeencapsulation?1.Theconversionofonetypeofobjecttoanother.2.Theruntimeresolutionofmethodcalls.3.Theexpositionofdata.4.Theseparationofinterfaceandimplementation.答案:4,繼承,繼承表示現(xiàn)實世界中遺傳關(guān)系的直接模擬。它表示類之間的內(nèi)在聯(lián)系以及對屬性和操作的共享。,繼承(續(xù)),聲明擴充類的語法:訪問修飾符class擴充類名稱:基類名稱/程序代碼擴充類繼承了所有定義在基類中數(shù)據(jù)的定義和方法。但是擴充類不繼承基類的構(gòu)造函數(shù)。繼承的例子(1):P76例4-2,兩種實現(xiàn)繼承的方式:類繼承和接口繼承。類繼承只允許單一繼承,接口可實現(xiàn)多重繼承。被繼承的類叫基類繼承自其他類的類叫擴充類,多態(tài),用相同的操作名在一個類層次的不同類中實現(xiàn)不同的功能,相同的消息由同一(父)類的不同對象接收時,導致不同的行為。舉例:幾何圖形類層次中的多態(tài)性。其派生類“圓”、“長方形”、“三角形”等都有方法“求面積”。,幾何圖形,圓,三角形,幾何圖形,圓,Shape類GetArea(),Rectangle類GetArea(),Circle類GetArea(),Triangle類GetArea(),1、虛擬方法在基類中,如果想讓某個方法或者事件被擴充類重寫,可以使用修飾符virtual表明:publicvirtualvoidmyMethod()/程序代碼擴充類則用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ù)),使用虛擬方法和重寫方法時,要注意下面幾個方面:虛擬方法不能聲明為靜態(tài)的。Virtual不能和private一起使用。重寫方法的名稱、參數(shù)個數(shù)、類型以及返回值都必須和虛擬方法的一致。舉例P79頁例4-4,多態(tài)(續(xù)),2、隱藏基類的方法在擴充類中,可以使用new關(guān)鍵字來隱藏基類的方法,即使用一個完全不同的方法取代舊的方法。與方法重寫不同的是,使用new關(guān)鍵字時并不要求基類中的方法聲明為virtual,只要在擴充類的方法前聲明為new,就可以隱藏基類的方法。,多態(tài)(續(xù)),3、抽象類使用abstract修飾符。抽象類只能做基類。抽象類與非抽象類的區(qū)別:第一是抽象類不能直接被實例化,只能在擴充類中通過繼承使用,對抽象類使用new運算符會產(chǎn)生編譯時錯誤第二個不同點是抽象類可以包含抽象成員,而非抽象類不能包含抽象成員。當從抽象類派生非抽象類時,這些非抽象類必須具體實現(xiàn)所繼承的所有抽象成員。,補充題目,Question32.(單選)以下描述錯誤的是()1.在C+中支持抽象類而在C#中不支持抽象類。2.C+中可在頭文件中聲明類的成員而在CPP文件中定義類的成員,在C#中沒有頭文件并且在同一處聲明和定義類的成員。3.在C#中可使用new修飾符顯式隱藏從基類繼承的成員。4.在C#中要在派生類中重新定義基類的虛函數(shù)必須在前面加Override。,練習(2),abstractclassBaseClasspublicvirtualvoidMethodA()Console.WriteLine(BaseClass);classClass1:BaseClasspublicvoidMethodA()Console.WriteLine(Class1);classClass2:Class1在Main方法中執(zhí)行下列語句:Class2o=newClass2();o.MethodA();問:執(zhí)行結(jié)果是什么?,4.2版本控制,用C#編寫方法時,如果在擴充類中重寫基類的方法,需要用override聲明;要隱藏基類的方法,需要用new聲明,這就是C#進行版本控制的依據(jù)。調(diào)用非虛擬方法時不會受到版本的影響調(diào)用虛擬方法的實現(xiàn)部分可能會因擴充類的重寫而影響執(zhí)行結(jié)果。舉例:P83例4-8P84例4-9,4.2版本控制(續(xù)),調(diào)用原則:調(diào)用繼承的最后實現(xiàn)部分的方法P85例4-10C#允許派生類包含與基類方法名稱相同的方法,規(guī)則如下:1)基類方法必須聲明為virtual2)若派生類中方法前無new或override關(guān)鍵字,方法執(zhí)行按存在new關(guān)鍵字一樣執(zhí)行3)若派生類中方法前帶new關(guān)鍵字,則此方法被定義為獨立于基類的方法4)若派生類中方法前帶override關(guān)鍵字,則派生類調(diào)用此方法,而非基類的方法。5)可從派生類中使用base關(guān)鍵字調(diào)用基類方法。,補充知識: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接口,接口的主要特點是只有聲明部分,沒有實現(xiàn)部分。接口成員的實現(xiàn)是通過類完成的。定義在接口中的方法都是public的。使用interface關(guān)鍵字聲明一個接口。常用的語法是:訪問修飾符interface接口名稱/接口體一般情況下,以大寫的“I”開頭指定接口名,表明這是一個接口。需要在不相關(guān)的類中實現(xiàn)同樣的功能時,可以使用接口。,4.3接口,P88例4-11顯示方式實現(xiàn)接口例4-12注意:顯示實現(xiàn)接口時,不能通過類的實例進行訪問,而必須使用接口實例。通過接口實現(xiàn)多繼承例4-13,補充知識:C#面試題,不定項選擇題以下敘述正確的是:A.接口中可以有虛方法。B.一個類可以實現(xiàn)多個接口。C.接口不能被實例化。D.接口中可以包含已實現(xiàn)的方法。B、C(2)以下敘述正確的是:A.接口和抽象類一樣均只能聲明,而不能有實現(xiàn)部分。B.類可以繼承多個接口,但僅能從一個抽象類或其它類型的單個類繼承。C.接口中可以定義屬性、方法和事件,但只聲明不實現(xiàn)。D.類的多繼承可以通過接口實現(xiàn)。B、C、D,4.4委托,類似與C+中的函數(shù)指針,但有很大不同委托的聲明例如:publicdelegatevoidFuncDelegate(stringstr);委托的使用具體內(nèi)容不再詳細講述,4.5序列化與反序列化,序列化獲取對象并將其狀態(tài)信息轉(zhuǎn)換為可存儲或可傳輸形式的過程。反序列化將對象還原回序列化之前的內(nèi)容。序列化和反序列化是一個互逆的過程。.NETFramework提供的兩種序列化技術(shù)二進制序列化XML和SOAP序列化,4.5序列化與反序列化,1、如何序列化一個類:在類的上方加上Serializable特性即可。SerializablepublicclassMyClass2、二進制序列化MyClassuser=newMyClass();IFormatterformater=newBinaryFormatter();Streamstream=newFileStream(UserInfo.bin,FileMode.Create,FileAccess.Write,FileShare.None);formater.Serialize(stream,user);stream.Close();特點:二進制序列化會將一個類的所有成員變量都進行序列化,包括私有變量、公共屬性、方法等。,4.5序列化與反序列化,3、二進制反序列化IFormatterformatter=newBinaryFormatter();Streamstream=newFileStream(UserInfo.bin,FileMode.Open,FileAccess.Read,FileShare.Read);MyClassc=(MyClass)formatter.Deserialize(stream);stream.Close();特點:反序列化后,對象c與序列化之前的狀態(tài)完全相同。,補充:二進制序列化與反序列化舉例,保存窗體位置、顏色與數(shù)據(jù)庫連接信息設(shè)置,補充:二進制序列化與反序列化舉例,當輸入服務(wù)器等信息、改變窗體前景色、位置后,退出應(yīng)用程序,再次啟動,可看到仍然是退出前的狀態(tài)。,4.5序列化與反序列化,4、XML序列化(1)XML序列化僅將對象的公共字段和屬性值序列化為XML流,而不轉(zhuǎn)換方法、索引器、私有字段或只讀屬性(只讀集合除外)。(2)XML序列化不包括類型信息,即不能保證序列化后的對象在被反序列化時,變?yōu)橥活愋偷膶ο?。?)XML序列化的實現(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();注意:反序列化一個對象時不會調(diào)用構(gòu)造函數(shù),這一點與創(chuàng)建對象不同。,4.6泛型處理,泛型(Generic)一般用在集合和在集合上運行的方法中。.NET框架2.0以前的版本不支持泛型。使用泛型具有以下明顯的優(yōu)點:1)可以避免以下兩個問題:內(nèi)部實現(xiàn)代碼冗余和困擾開發(fā)人員的含混不清的編譯器錯誤提示;2)類型安全;3)二進制代碼重用;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的堆棧缺點,性能問題值類型需頻繁地裝箱、拆箱,造成較多的垃圾碎片,增加垃圾回收的負擔引用類型需要強制類型轉(zhuǎn)換類型安全問題(更嚴重)編譯時任務(wù)類型都轉(zhuǎn)換成object,無法保證運行時類型安全。例如:Stackstack=newStack();stack.Push(“abc”);intnumber=(int)stack.Pop();,4.6泛型解決辦法,publicclassIntStackintm_Items;publicvoidPush(intitem).publicintPop().,publicclassStringStackstringm_Items;publicvoidPush(stringitem).publicstringPop().,功能相似,代碼冗余!維護麻煩!,基于Object的堆棧,IntStackStringStack,代碼冗余,維護復雜,工作效率低,性能問題、類型安全問題,有沒有好的解決辦法?,有,泛型,解決方法采用泛型,publicclassStackTm_Items;publicvoidPush(Titem).publicTPop().,泛型是如何實現(xiàn)的?,在.NET2.0中,泛型在IL(中間語言)和CLR本身中具有本機支持編譯泛型時,就像編譯類一樣,泛型僅保留一個占位符。而用特定類型實例化的泛型代碼,編譯時會將泛型替換為實例化的特定類型。,泛型實現(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引用一個泛型方法程序舉例:使用泛型方法來實現(xiàn)int、double、float類型的數(shù)據(jù)交換方法。,常用泛型,凡是有對應(yīng)泛型類型的類就盡量不要使用早期提供的非泛型類型的類。下面的泛型類型對應(yīng)于低版本提供的類型:泛型類低版本提供的非泛型類ListArrayListDictionaryHashtableQueueQueueStackStackSortedListSortedList,實驗中用到的泛型,SortedList:按鍵排序的鍵值對集合,是運算復雜度為O(logn)的二進制搜索樹。常用方法:Add方法:將帶有指定鍵和值的元素添加到SortedList中例如(注意:如果插入重復的鍵會產(chǎn)生異常):SortedListopenWith=newSortedList();openWith.Add(txt,notepad.exe);openWith.Add(bmp,paint.exe);,實驗中用到的泛型(續(xù)),如何遍歷泛型列表中的每個鍵值對SortedListlist=newSortedList();list.Add(a,123);list.Add(b,234);list.Add(c,456);foreach(stringstrinlist.Keys)Console.WriteLine(keyis:+str+,valueis:+liststr.ToString();,實驗中用到的泛型(續(xù)),TryGetValue方法:獲取與指定的鍵相關(guān)聯(lián)的值。例如:stringvalue=;if(openWith.TryGetValue(tif,outvalue)Console.WriteLine(Forkey=tif,value=0.,value);elseConsole.WriteLine(Key=tifisnotfound.);,實
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 兒科無尿護理
- 語言送給蛤蟆的禮物
- 硬式內(nèi)鏡處理流程及注意事項
- 自我時間管理培訓
- 帶狀皰疹護理查房
- 高中一年級必修一化學筆記總結(jié)模版
- 汽車行業(yè)2024年年報及2025年一季報綜述:以舊換新政策推動業(yè)績增長行業(yè)盈利能力復蘇191mb
- 寶寶感冒護理指南
- 三晉卓越聯(lián)盟·2024-2025學年高三5月質(zhì)量檢測卷(25-X-635C)地理(B)
- 資料員工作總結(jié)模版
- 委托尋找房源協(xié)議書
- 景觀畢業(yè)設(shè)計
- 法洛四聯(lián)癥的護理課件
- 2025年佛山市三水海江建設(shè)投資有限公司招聘筆試參考題庫附帶答案詳解
- 鹵味學員合同協(xié)議書
- 統(tǒng)編版三年級語文下冊期末考試卷(帶答案)
- 【課件】清朝的邊疆治理+課件統(tǒng)編版七年級歷史下冊
- 外貿(mào)業(yè)務(wù)培訓課件教學
- 2025年健康管理師職業(yè)技能考試筆試試題(100題)含答案
- 中國成人呼吸系統(tǒng)疾病家庭氧療指南(2024年)解讀
- 2025年企業(yè)管理專業(yè)考試試題及答案詳解
評論
0/150
提交評論