




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 本章教學(xué)目的介紹面向?qū)ο蟾呒壘幊痰南嚓P(guān)知識,使學(xué)生對C#高級編程有一個感性認(rèn)識。 本章教學(xué)要求(1)掌握繼承、泛型的概念及基本用法;(2)掌握與實(shí)驗(yàn)有關(guān)的相關(guān)內(nèi)容,包括封裝、繼承與多態(tài)、泛型處理 ;(3)了解其他內(nèi)容。第1頁/共53頁實(shí)驗(yàn)中的問題解答1. 如何添加某個事件(例如窗體的Shown事件)?如何刪除某個事件?答:添加和刪除事件均在設(shè)計(jì)視圖下利用屬性中的事件完成。2. 使用textBoxStartAmount.Focus(); 與使用鍵讓某控件獲取焦點(diǎn)有何不同?答:前者用于動態(tài)設(shè)置,后者用于靜態(tài)設(shè)置。3. 實(shí)驗(yàn)2:private double Caculate(double star
2、tAmount, double rate, int count)疊加次數(shù)count是什么意思?答:疊加次數(shù)是指到期后將計(jì)算出來的利息作為存款再次計(jì)算,例如存款時間為1年,則按年算息疊加次數(shù)為1,按月算息疊加次數(shù)為12,按季度算息疊加次數(shù)為4。4. 實(shí)驗(yàn)報(bào)告什么時候交?進(jìn)度如何安排?答:各人根據(jù)自己的情況安排進(jìn)度,完成一個,寫一個實(shí)驗(yàn)報(bào)告。5. 如何定義屬性?如何給屬性賦值?如何獲取屬性的值?答:見書上P59例3-10第2頁/共53頁4.1 封裝、繼承與多態(tài)封裝:隱藏調(diào)用者不需要了解的信息。繼承:簡化類的設(shè)計(jì)。多態(tài):類為名稱相同的方法提供不同實(shí)現(xiàn)方式的能力。第3頁/共53頁封裝 模塊信息通過類封
3、裝 類的成員通過字段、屬性、方法、事件封裝u私有的用privateu可以被繼承的用protectedu公共成員用publicu不要為了方便把什么都定義成publicu不要為了方便把什么都定義成static 通過屬性進(jìn)行封裝的例子:P73例4-1第4頁/共53頁封裝舉例:對象封裝了對象的數(shù)據(jù)以及對這些數(shù)據(jù)的操作。對象是屬性和操作的組合對象的表現(xiàn)(服務(wù)、接口)和實(shí)現(xiàn)細(xì)節(jié)分開第5頁/共53頁/MyClass.csusing System;namespace ConsoleTest class MyClass private int number; public int Number get retu
4、rn number; set if (value 0) number = value; /Program.cs/Program.csusing System;using System;namespace ConsoleTestnamespace ConsoleTest public class Program public class Program public static void Main() public static void Main() MyClass me = new MyClass me = new MyClass();MyClass(); me.Number = -1;
5、me.Number = -1; Console.WriteLine(Console.WriteLine( Number:0, Number:0, me.Number);me.Number); Console.ReadLine(); Console.ReadLine(); 回答:回答:NumberNumber輸出的值是多少?輸出的值是多少?第6頁/共53頁練習(xí)(1) Question 47. (單選)In Object oriented Programming, how would you describe encapsulation?1. The conversion of one type
6、of object to another.2. The runtime resolution of method calls.3. The exposition of data.4. The separation of interface and implementation. 答案:4第7頁/共53頁繼承 繼承表示現(xiàn)實(shí)世界中遺傳關(guān)系的直接模擬。 它表示類之間的內(nèi)在聯(lián)系以及對屬性和操作的共享。第8頁/共53頁繼承(續(xù))聲明擴(kuò)充類的語法: 訪問修飾符 class 擴(kuò)充類名稱:基類名稱 /程序代碼 擴(kuò)充類繼承了所有定義在基類中數(shù)據(jù)的定義和方法。但是擴(kuò)充類不繼承基類的構(gòu)造函數(shù)。繼承的例子(1):P7
7、6例4-2兩種實(shí)現(xiàn)繼承的方式:類繼承和接口繼承。類繼承只允許單一繼承 ,接口可實(shí)現(xiàn)多重繼承。被繼承的類叫基類繼承自其他類的類叫擴(kuò)充類第9頁/共53頁多態(tài) 用相同的操作名在一個類層次的不同類中實(shí)現(xiàn)不同的功能,相同的消息由同一(父)類的不同對象接收時,導(dǎo)致不同的行為。 舉例:幾何圖形類層次中的多態(tài)性。其派生類“圓”、“長方形”、“三角形”等都有方法“求面積”。幾何圖形圓三角形幾何圖形圓Shape類 GetArea() Rectangle類GetArea()Circle類GetArea()Triangle類GetArea()第10頁/共53頁1、虛擬方法 在基類中,如果想讓某個方法或者事件被擴(kuò)充類重
8、寫,可以使用修飾符virtual表明: public virtual void myMethod() /程序代碼 擴(kuò)充類則用override重寫: public override void myMethod() /程序代碼 多態(tài)(續(xù))第11頁/共53頁/MyClass.csusing System;namespace ConsoleTest class MyClass public virtual void Hello() Console.WriteLine(123); /MyNewClass.cs/MyNewClass.csusing System;using System;namespac
9、e ConsoleTestnamespace ConsoleTest class MyNewClass : MyClass class MyNewClass : MyClass private string str = private string str = hello;hello; public override void Hello() public override void Hello() Number = 2; Number = 2; Console.WriteLine(str);Console.WriteLine(str); 第12頁/共53頁多態(tài)(續(xù)) 使用虛擬方法和重寫方法時
10、,要注意下面幾個方面: 虛擬方法不能聲明為靜態(tài)的。 Virtual不能和private一起使用。 重寫方法的名稱、參數(shù)個數(shù)、類型以及返回值都必須和虛擬方法的一致。 舉例 P79頁例4-4第13頁/共53頁多態(tài)(續(xù))2、隱藏基類的方法 在擴(kuò)充類中,可以使用new關(guān)鍵字來隱藏基類的方法,即使用一個完全不同的方法取代舊的方法。 與方法重寫不同的是,使用new關(guān)鍵字時并不要求基類中的方法聲明為virtual,只要在擴(kuò)充類的方法前聲明為new,就可以隱藏基類的方法。第14頁/共53頁多態(tài)(續(xù))3、抽象類 使用abstract修飾符。 抽象類只能做基類。 抽象類與非抽象類的區(qū)別: 第一是抽象類不能直接被實(shí)
11、例化,只能在擴(kuò)充類中通過繼承使用,對抽象類使用new運(yùn)算符會產(chǎn)生編譯時錯誤 第二個不同點(diǎn)是抽象類可以包含抽象成員,而非抽象類不能包含抽象成員。當(dāng)從抽象類派生非抽象類時,這些非抽象類必須具體實(shí)現(xiàn)所繼承的所有抽象成員。第15頁/共53頁補(bǔ)充題目 Question 32. (單選)以下描述錯誤的是()1.在C+中支持抽象類而在C#中不支持抽象類。2.C+中可在頭文件中聲明類的成員而在CPP文件中定義類的成員,在C#中沒有頭文件并且在同一處聲明和定義類的成員。3.在C#中可使用 new 修飾符顯式隱藏從基類繼承的成員。4.在C#中要在派生類中重新定義基類的虛函數(shù)必須在前面加Override。 第16頁
12、/共53頁練習(xí)(2)abstract class BaseClass public virtual void MethodA() Console.WriteLine(BaseClass);class Class1: BaseClass public void MethodA() Console.WriteLine(Class1);class Class2: Class1 在Main方法中執(zhí)行下列語句: Class2 o = new Class2(); o.MethodA(); 問:執(zhí)行結(jié)果是什么? 第17頁/共53頁4.2 版本控制 用C#編寫方法時,如果在擴(kuò)充類中重寫基類的方法,需要用ove
13、rride聲明;要隱藏基類的方法,需要用new聲明,這就是C#進(jìn)行版本控制的依據(jù)。 調(diào)用非虛擬方法時不會受到版本的影響 調(diào)用虛擬方法的實(shí)現(xiàn)部分可能會因擴(kuò)充類的重寫而影響執(zhí)行結(jié)果。舉例: P83 例4-8 P84 例4-9 第18頁/共53頁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)若派生類中方法前帶overr
14、ide關(guān)鍵字,則派生類調(diào)用此方法,而非基類的方法。5)可從派生類中使用base關(guān)鍵字調(diào)用基類方法。 第19頁/共53頁補(bǔ)充知識:C#面試題public class A public A() Console.WriteLine(“A”); public virtual void Fun() Console.WriteLine(A.Fun(); public class B: A public class B: A public B() public B() Console.WriteLine( Console.WriteLine(“B B”); ); public new void Fun()
15、public new void Fun() Console.WriteLine(B.Fun(); Console.WriteLine(B.Fun(); public static void Main() public static void Main() A a = new B(); A a = new B(); a.Fun(); a.Fun(); /輸出結(jié)果為:輸出結(jié)果為: A A B B A.Fun A.Fun()()第20頁/共53頁4.3 接口 接口的主要特點(diǎn)是只有聲明部分,沒有實(shí)現(xiàn)部分。 接口成員的實(shí)現(xiàn)是通過類完成的。 定義在接口中的方法都是public的。 使用interface關(guān)
16、鍵字聲明一個接口。常用的語法是: 訪問修飾符 interface 接口名稱 / 接口體 一般情況下,以大寫的“I”開頭指定接口名,表明這是一個接口。 需要在不相關(guān)的類中實(shí)現(xiàn)同樣的功能時,可以使用接口。第21頁/共53頁4.3 接口 P88 例4-11 顯示方式實(shí)現(xiàn)接口 例4-12 注意:顯示實(shí)現(xiàn)接口時,不能通過類的實(shí)例進(jìn)行訪問,而必須使用接口實(shí)例。 通過接口實(shí)現(xiàn)多繼承 例4-13第22頁/共53頁補(bǔ)充知識:C#面試題不定項(xiàng)選擇題(1) 以下敘述正確的是: A. 接口中可以有虛方法。 B. 一個類可以實(shí)現(xiàn)多個接口。 C. 接口不能被實(shí)例化。 D. 接口中可以包含已實(shí)現(xiàn)的方法。 B、C(2)以下敘
17、述正確的是: A. 接口和抽象類一樣均只能聲明,而不能有實(shí)現(xiàn)部分。 B. 類可以繼承多個接口,但僅能從一個抽象類或其它類型的單個類繼承。 C. 接口中可以定義屬性、方法和事件,但只聲明不實(shí)現(xiàn)。 D. 類的多繼承可以通過接口實(shí)現(xiàn)。 B、C、D第23頁/共53頁4.4 委托 類似與C+中的函數(shù)指針,但有很大不同 委托的聲明 例如: public delegate void FuncDelegate(string str); 委托的使用 具體內(nèi)容不再詳細(xì)講述第24頁/共53頁4.5 序列化與反序列化 序列化 獲取對象并將其狀態(tài)信息轉(zhuǎn)換為可存儲或可傳輸形式的過程。 反序列化 將對象還原回序列化之前的內(nèi)
18、容。 序列化和反序列化是一個互逆的過程。 .NET Framework提供的兩種序列化技術(shù) 二進(jìn)制序列化 XML和SOAP序列化第25頁/共53頁4.5 序列化與反序列化1、如何序列化一個類:在類的上方加上Serializable特性即可。 Serializable public class MyClass 2、二進(jìn)制序列化 MyClass user = new MyClass(); IFormatter formater = new BinaryFormatter(); Stream stream = new FileStream(UserInfo.bin, FileMode.Create,
19、 FileAccess.Write, FileShare.None); formater.Serialize(stream, user); stream.Close(); 特點(diǎn): 二進(jìn)制序列化會將一個類的所有成員變量都進(jìn)行序列化,包括私有變量、公共屬性、方法等。 第26頁/共53頁4.5 序列化與反序列化3、二進(jìn)制反序列化 IFormatter formatter = new BinaryFormatter(); Stream stream = new FileStream(UserInfo.bin, FileMode.Open, FileAccess.Read, FileShare.Read
20、); MyClass c = (MyClass)formatter.Deserialize(stream); stream.Close();特點(diǎn):反序列化后,對象c與序列化之前的狀態(tài)完全相同。第27頁/共53頁補(bǔ)充:二進(jìn)制序列化與反序列化舉例保存窗體位置、顏色與數(shù)據(jù)庫連接信息設(shè)置第28頁/共53頁補(bǔ)充:二進(jìn)制序列化與反序列化舉例 當(dāng)輸入服務(wù)器等信息、改變窗體前景色、位置后,退出應(yīng)用程序,再次啟動,可看到仍然是退出前的狀態(tài)。第29頁/共53頁4.5 序列化與反序列化4、XML序列化(1)XML 序列化僅將對象的公共字段和屬性值序列化為XML流,而不轉(zhuǎn)換方法、索引器、私有字段或只讀屬性(只讀集合除
21、外)。 (2)XML 序列化不包括類型信息,即不能保證序列化后的對象在被反序列化時,變?yōu)橥活愋偷膶ο蟆?(3)XML序列化的實(shí)現(xiàn)步驟Class1 user = new Class1();user.AccountName = aa;XmlSerializer mySerializer = new XmlSerializer(typeof(Class1);StreamWriter myWriter = new StreamWriter(UserInfo.xml);mySerializer.Serialize(myWriter, user);myWriter.Close();第30頁/共53頁4.
22、5 序列化與反序列化(4)XML反序列化的步驟Class1 c;XmlSerializer mySerializer = new XmlSerializer(typeof(Class1);FileStream myFileStream = new FileStream(UserInfo.xml, FileMode.Open);c = (Class1) mySerializer.Deserialize(myFileStream);myFileStream.Close();注意:反序列化一個對象時不會調(diào)用構(gòu)造函數(shù),這一點(diǎn)與創(chuàng)建對象不同。第31頁/共53頁4.6 泛型處理 泛型(Generic)一般
23、用在集合和在集合上運(yùn)行的方法中。.NET框架2.0以前的版本不支持泛型。 使用泛型具有以下明顯的優(yōu)點(diǎn): 1)可以避免以下兩個問題:內(nèi)部實(shí)現(xiàn)代碼冗余和困擾開發(fā)人員的含混不清的編譯器錯誤提示; 2)類型安全;3)二進(jìn)制代碼重用;4)性能;5)清晰性。 第32頁/共53頁4.6 泛型問題描述public class Stack object m_Items; public void Push(object item) . public object Pop() . 使用舉例:Stack stack = new Stack();stack.Push(1);int number=(int)stack.P
24、op();stack.Push(“str”);string str=(string)stack.Pop();第33頁/共53頁基于Object的堆棧缺點(diǎn) 性能問題 值類型需頻繁地裝箱、拆箱,造成較多的垃圾碎片,增加垃圾回收的負(fù)擔(dān) 引用類型需要強(qiáng)制類型轉(zhuǎn)換 類型安全問題(更嚴(yán)重) 編譯時任務(wù)類型都轉(zhuǎn)換成object,無法保證運(yùn)行時類型安全。 例如:Stack stack = new Stack(); stack.Push(“abc”); int number = (int)stack.Pop();第34頁/共53頁4.6 泛型解決辦法public class IntStack int m_Ite
25、ms;public void Push(int item) .public int Pop() . public class StringStack public class StringStack string m_Items;string m_Items;public void Push(string item) public void Push(string item) .public string Pop() public string Pop() . . 功能相似,代碼冗余!維護(hù)麻煩!第35頁/共53頁基于Object的堆棧IntStackStringStack代碼冗余,維護(hù)復(fù)雜,工
26、作效率低性能問題、類型安全問題有沒有好的解決辦法?有,泛型第36頁/共53頁解決方法采用泛型public class Stack T m_Items;public void Push(T item) .public T Pop() . 第37頁/共53頁泛型是如何實(shí)現(xiàn)的? 在.NET 2.0中,泛型在IL(中間語言)和CLR本身中具有本機(jī)支持 編譯泛型時,就像編譯類一樣,泛型僅保留一個占位符。 而用特定類型實(shí)例化的泛型代碼,編譯時會將泛型替換為實(shí)例化的特定類型。第38頁/共53頁泛型實(shí)現(xiàn) public class Stack T m_Items; public void Push(T item
27、) . public T Pop() . 使用舉例:Stack stack = new Stackstack.Push(1);int number = stack.Pop();第39頁/共53頁泛型的定義和引用 泛型定義代碼語法如下: 訪問修飾符返回類型 泛型支持類型 泛型名稱 其中CLR支持的泛型類、結(jié)構(gòu)、方法、接口和委托等。泛型類定義舉例:class Node T data; Node next; 例4-19 引用泛型類第40頁/共53頁泛型的引用泛型類定義舉例: void Swap(ref T item1, ref T item2) T temp = item1; item1 = ite
28、m2; item2 = temp; 例4-20 引用一個泛型方法程序舉例:使用泛型方法來實(shí)現(xiàn)int、double、float類型的數(shù)據(jù)交換方法。第41頁/共53頁常用泛型 凡是有對應(yīng)泛型類型的類就盡量不要使用早期提供的非泛型類型的類。下面的泛型類型對應(yīng)于低版本提供的類型: 泛型類 低版本提供的非泛型類 List ArrayList Dictionary Hashtable Queue Queue Stack Stack SortedList SortedList第42頁/共53頁實(shí)驗(yàn)中用到的泛型 SortedList :按鍵排序的鍵值對集合,是運(yùn)算復(fù)雜度為 O(log n) 的二進(jìn)制搜索樹 。
29、 常用方法: Add方法:將帶有指定鍵和值的元素添加到SortedList 中 例如(注意:如果插入重復(fù)的鍵會產(chǎn)生異常):SortedList openWith = new SortedList(); openWith.Add(txt, notepad.exe); openWith.Add(bmp, paint.exe); 第43頁/共53頁實(shí)驗(yàn)中用到的泛型(續(xù)) 如何遍歷泛型列表中的每個鍵值對 SortedList list=new SortedList (); list.Add(a, 123); list.Add(b, 234); list.Add(c, 456); foreach (st
30、ring str in list.Keys) Console.WriteLine(key is : + str + ,value is :+liststr.ToString(); 第44頁/共53頁實(shí)驗(yàn)中用到的泛型(續(xù)) TryGetValue方法:獲取與指定的鍵相關(guān)聯(lián)的值 。例如:string value = ; if (openWith.TryGetValue(tif, out value) Console.WriteLine(For key = tif, value = 0., value); else Console.WriteLine(Key = tif is not found.); 第45
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度工傷人員傷殘?jiān)u定及賠償協(xié)議
- 2025年度集體合同協(xié)商中的勞動爭議處理
- 2025年度幼兒園保安聘用合同標(biāo)準(zhǔn)范本
- 二零二五年度專業(yè)護(hù)工針對心血管疾病病人護(hù)理合同
- 2025年度中小企業(yè)發(fā)展基金借款連帶擔(dān)保人合同
- 2025年度單位食堂承包及員工滿意度提升協(xié)議
- 2025年度知識產(chǎn)權(quán)股份代持許可使用協(xié)議
- 2025年度國際文化交流項(xiàng)目合作誠意金協(xié)議
- 2025年度工程監(jiān)理個人勞動合同(工程質(zhì)量安全管理)
- 2025年度航空航天器復(fù)合材料維修合同
- 簡單的路線圖(說課稿)2024-2025學(xué)年三年級上冊數(shù)學(xué)西師大版
- 成都市2024-2025學(xué)年度上期期末高一期末語文試卷(含答案)
- 2025年教育局財(cái)務(wù)工作計(jì)劃
- Unit 5 Now and Then-Lesson 3 First-Time Experiences 說課稿 2024-2025學(xué)年北師大版(2024)七年級英語下冊
- 《中國心力衰竭診斷和治療指南2024》解讀
- 中小學(xué)智慧校園建設(shè)方案
- 中國食物成分表2020年權(quán)威完整改進(jìn)版
- 【MOOC】影視鑒賞-揚(yáng)州大學(xué) 中國大學(xué)慕課MOOC答案
- 危險(xiǎn)性較大的分部分項(xiàng)工程清單安全管理措施
- 高壓輸電線路質(zhì)量、檢查、驗(yàn)收培訓(xùn)課件
- 混合型頸椎病課件
評論
0/150
提交評論