版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、1 1 第第4 4章章 面向?qū)ο蟮母呒壘幊堂嫦驅(qū)ο蟮母呒壘幊?封裝、繼承與多態(tài)封裝、繼承與多態(tài) 版本控制版本控制 接口接口 委托委托 泛型處理泛型處理 2 2 本章教學(xué)目的本章教學(xué)目的 介紹面向?qū)ο蟾呒壘幊痰南嚓P(guān)知識,使學(xué)生對介紹面向?qū)ο蟾呒壘幊痰南嚓P(guān)知識,使學(xué)生對C#C#高級編程有高級編程有 一個感性認(rèn)識。一個感性認(rèn)識。 本章教學(xué)要求本章教學(xué)要求 (1 1)掌握繼承、泛型的概念及基本用法;)掌握繼承、泛型的概念及基本用法; (2 2)掌握與實(shí)驗(yàn)有關(guān)的相關(guān)內(nèi)容,包括封裝、繼承與多態(tài)、)掌握與實(shí)驗(yàn)有關(guān)的相關(guān)內(nèi)容,包括封裝、繼承與多態(tài)、 泛型處理泛型處理 ; (3 3)了解其他內(nèi)容。)了解其他內(nèi)容
2、。 3 3 實(shí)驗(yàn)中的問題解答實(shí)驗(yàn)中的問題解答 如何添加某個事件(例如窗體的如何添加某個事件(例如窗體的ShownShown事件)?如何刪除某個事件?事件)?如何刪除某個事件? 答:添加和刪除事件均在設(shè)計視圖下利用屬性中的事件完成。答:添加和刪除事件均在設(shè)計視圖下利用屬性中的事件完成。 使用使用textBoxStartAmount.Focus(); textBoxStartAmount.Focus(); 與使用與使用鍵讓某控件獲取焦點(diǎn)有鍵讓某控件獲取焦點(diǎn)有 何不同?何不同? 答:前者用于動態(tài)設(shè)置,后者用于靜態(tài)設(shè)置。答:前者用于動態(tài)設(shè)置,后者用于靜態(tài)設(shè)置。 實(shí)驗(yàn)實(shí)驗(yàn)2 2: private dou
3、ble Caculate(double startAmount, double rate, int private double Caculate(double startAmount, double rate, int count)count)疊加次數(shù)疊加次數(shù)countcount是什么意思?是什么意思? 答:疊加次數(shù)是指到期后將計算出來的利息作為存款再次計算,例如存答:疊加次數(shù)是指到期后將計算出來的利息作為存款再次計算,例如存 款時間為款時間為1 1年,則按年算息疊加次數(shù)為年,則按年算息疊加次數(shù)為1 1,按月算息疊加次數(shù)為,按月算息疊加次數(shù)為1212,按季,按季 度算息疊加次數(shù)為度算息疊加次
4、數(shù)為4 4。 實(shí)驗(yàn)報告什么時候交?進(jìn)度如何安排?實(shí)驗(yàn)報告什么時候交?進(jìn)度如何安排? 答:各人根據(jù)自己的情況安排進(jìn)度,完成一個,寫一個實(shí)驗(yàn)報告。答:各人根據(jù)自己的情況安排進(jìn)度,完成一個,寫一個實(shí)驗(yàn)報告。 如何定義屬性?如何給屬性賦值?如何獲取屬性的值?如何定義屬性?如何給屬性賦值?如何獲取屬性的值? 答:見書上答:見書上P59P59例例3-103-10 4 4 4.1 4.1 封裝、繼承與多態(tài)封裝、繼承與多態(tài) 封裝:隱藏調(diào)用者不需要了解的信息。封裝:隱藏調(diào)用者不需要了解的信息。 繼承:簡化類的設(shè)計。繼承:簡化類的設(shè)計。 多態(tài):類為名稱相同的方法提供不同實(shí)現(xiàn)方式的能力。多態(tài):類為名稱相同的方法提供
5、不同實(shí)現(xiàn)方式的能力。 5 5 封裝封裝 模塊信息通過類封裝模塊信息通過類封裝 類的成員通過字段、屬性、方法、事件封裝類的成員通過字段、屬性、方法、事件封裝 u私有的用私有的用privateprivate u可以被繼承的用可以被繼承的用protectedprotected u公共成員用公共成員用publicpublic u不要為了方便把什么都定義成不要為了方便把什么都定義成publicpublic u不要為了方便把什么都定義成不要為了方便把什么都定義成staticstatic 通過屬性進(jìn)行封裝的例子:通過屬性進(jìn)行封裝的例子:P73P73例例4-14-1 6 6 封裝舉例:封裝舉例: 對象封裝了對
6、象的數(shù)據(jù)以及對這些數(shù)據(jù)的操作。 對象是屬性和操作的組合 對象的表現(xiàn)(服務(wù)、接口)和實(shí)現(xiàn)細(xì)節(jié)分開 7 7 /MyClass.cs/MyClass.cs using System;using System; namespace ConsoleTestnamespace ConsoleTest class MyClass class MyClass private int number; private int number; public int Number public int Number get get return number; return number; set set if (v
7、alue 0) if (value 0) number = value; number = value; /Program.cs/Program.cs using System;using System; namespace ConsoleTestnamespace ConsoleTest public class Program public class Program public static void Main() public static void Main() MyClass me = new MyCl MyClass me = new MyCl ass();ass(); me.
8、Number = -1; me.Number = -1; Console.WriteLine( Console.WriteLine( Number:0, me. Number:0, me. Number);Number); Console.ReadLine(); Console.ReadLine(); 回答:回答:NumberNumber輸出的值是多少?輸出的值是多少? 8 8 練習(xí)練習(xí)(1)(1) Question 47. (Question 47. (單選單選) ) In Object oriented Programming, how would you In Object orient
9、ed Programming, how would you describe encapsulation?describe encapsulation? 1. The conversion of one type of object to another.1. The conversion of one type of object to another. 2. The runtime resolution of method calls.2. The runtime resolution of method calls. 3. The exposition of data.3. The ex
10、position of data. 4. The separation of interface and implementation.4. The separation of interface and implementation. 答案:答案:4 4 9 9 繼承繼承 繼承表示現(xiàn)實(shí)世界中遺傳關(guān)系的直接模繼承表示現(xiàn)實(shí)世界中遺傳關(guān)系的直接模 擬。擬。 它表示類之間的內(nèi)在聯(lián)系以及對屬性和它表示類之間的內(nèi)在聯(lián)系以及對屬性和 操作的共享。操作的共享。 10 10 繼承(續(xù))繼承(續(xù)) 聲明擴(kuò)充類的語法:聲明擴(kuò)充類的語法: 訪問修飾符訪問修飾符 class class 擴(kuò)充類名稱:基類名稱擴(kuò)充類名稱
11、:基類名稱 / /程序代碼程序代碼 擴(kuò)充類繼承了所有定義在基類中數(shù)據(jù)的定義和方法。但擴(kuò)充類繼承了所有定義在基類中數(shù)據(jù)的定義和方法。但 是是擴(kuò)充類不繼承基類的構(gòu)造函數(shù)擴(kuò)充類不繼承基類的構(gòu)造函數(shù)。 繼承的例子(繼承的例子(1 1):):P76P76例例4-24-2 兩種實(shí)現(xiàn)繼承的方式:類繼承和接口繼承。兩種實(shí)現(xiàn)繼承的方式:類繼承和接口繼承。 類繼承只允許單一繼承類繼承只允許單一繼承 ,接口可實(shí)現(xiàn)多重繼承。,接口可實(shí)現(xiàn)多重繼承。 被繼承的類叫基類被繼承的類叫基類 繼承自其他類的類叫擴(kuò)充類繼承自其他類的類叫擴(kuò)充類 11 11 多態(tài)多態(tài) 用相同的操作名在一個類層次的不同類中實(shí)現(xiàn)不同用相同的操作名在一個類
12、層次的不同類中實(shí)現(xiàn)不同 的功能,相同的消息由同一的功能,相同的消息由同一( (父父) )類的不同對象接收類的不同對象接收 時,導(dǎo)致不同的行為。時,導(dǎo)致不同的行為。 舉例:幾何圖形類層次中的多態(tài)性。其派生類“圓”、“長 方形”、“三角形”等都有方法“求面積”。 幾何圖形 圓三角形 幾何圖形 圓 ShapeShape類類 GetArea() RectangleRectangle類類 GetArea() CircleCircle類類 GetArea() TriangleTriangle類類 GetArea() 12 12 1 1、虛擬方法、虛擬方法 在基類中,如果想讓某個方法或者事件被擴(kuò)充類在基類中
13、,如果想讓某個方法或者事件被擴(kuò)充類 重寫,可以使用修飾符重寫,可以使用修飾符virtualvirtual表明:表明: public public virtualvirtual void myMethod() void myMethod() /程序代碼程序代碼 擴(kuò)充類則用擴(kuò)充類則用overrideoverride重寫重寫: : public public overrideoverride void myMethod() void myMethod() /程序代碼程序代碼 多態(tài)(續(xù))多態(tài)(續(xù)) 13 13 /MyClass.cs/MyClass.cs using System;using Syst
14、em; namespace ConsoleTestnamespace ConsoleTest class MyClass class MyClass public virtual void Hello() public virtual void Hello() Console.WriteLine(123); Console.WriteLine(123); /MyNewClass.cs/MyNewClass.cs using System;using System; namespace ConsoleTestnamespace ConsoleTest class MyNewClass : MyC
15、lass class MyNewClass : MyClass private string str = hello private string str = hello ; public override void Hello() public override void Hello() Number = 2; Number = 2; Console.WriteLine(str); Console.WriteLine(str); 14 14 多態(tài)(續(xù))多態(tài)(續(xù)) 使用虛擬方法和重寫方法時,要注意下面幾個方面:使用虛擬方法和重寫方法時,要注意下面幾個方面: 虛擬方法不能聲明為靜態(tài)的。虛擬方法不
16、能聲明為靜態(tài)的。 VirtualVirtual不能和不能和privateprivate一起使用。一起使用。 重寫方法的名稱、參數(shù)個數(shù)、類型以及返回值都必須和重寫方法的名稱、參數(shù)個數(shù)、類型以及返回值都必須和 虛擬方法的一致。虛擬方法的一致。 舉例舉例 P79P79頁例頁例4-44-4 15 15 多態(tài)(續(xù))多態(tài)(續(xù)) 2 2、隱藏基類的方法、隱藏基類的方法 在擴(kuò)充類中,可以使用在擴(kuò)充類中,可以使用newnew關(guān)鍵字來隱藏基類的方法,關(guān)鍵字來隱藏基類的方法, 即使用一個完全不同的方法取代舊的方法。即使用一個完全不同的方法取代舊的方法。 與方法重寫不同的是,使用與方法重寫不同的是,使用newnew關(guān)
17、鍵字時并不要求基關(guān)鍵字時并不要求基 類中的方法聲明為類中的方法聲明為virtualvirtual,只要在擴(kuò)充類的方法前聲明,只要在擴(kuò)充類的方法前聲明 為為newnew,就可以隱藏基類的方法。,就可以隱藏基類的方法。 16 16 多態(tài)(續(xù))多態(tài)(續(xù)) 3 3、抽象類、抽象類 使用使用abstractabstract修飾符。修飾符。 抽象類只能做基類。抽象類只能做基類。 抽象類與非抽象類的區(qū)別:抽象類與非抽象類的區(qū)別: 第一是抽象類不能直接被實(shí)例化,只能在擴(kuò)充類中通第一是抽象類不能直接被實(shí)例化,只能在擴(kuò)充類中通 過繼承使用,對抽象類使用過繼承使用,對抽象類使用newnew運(yùn)算符會產(chǎn)生編譯時錯誤運(yùn)算
18、符會產(chǎn)生編譯時錯誤 第二個不同點(diǎn)是抽象類可以包含抽象成員,而非抽象第二個不同點(diǎn)是抽象類可以包含抽象成員,而非抽象 類不能包含抽象成員。當(dāng)從抽象類派生非抽象類時,這類不能包含抽象成員。當(dāng)從抽象類派生非抽象類時,這 些非抽象類必須具體實(shí)現(xiàn)所繼承的所有抽象成員。些非抽象類必須具體實(shí)現(xiàn)所繼承的所有抽象成員。 17 17 補(bǔ)充題目補(bǔ)充題目 Question 32. (Question 32. (單選單選) ) 以下描述錯誤的是()以下描述錯誤的是() 1.1.在在C+C+中支持抽象類而在中支持抽象類而在C#C#中不支持抽象類。中不支持抽象類。 2.C+2.C+中可在頭文件中聲明類的成員而在中可在頭文件中
19、聲明類的成員而在CPPCPP文件中定義類文件中定義類 的成員,在的成員,在C#C#中沒有頭文件并且在同一處聲明和定義類的中沒有頭文件并且在同一處聲明和定義類的 成員。成員。 3.3.在在C#C#中可使用中可使用 new new 修飾符顯式隱藏從基類繼承的成員。修飾符顯式隱藏從基類繼承的成員。 4.4.在在C#C#中要在派生類中重新定義基類的虛函數(shù)必須在前面中要在派生類中重新定義基類的虛函數(shù)必須在前面 加加OverrideOverride。 18 18 練習(xí)(練習(xí)(2 2) abstract class BaseClassabstract class BaseClass public virtu
20、al void MethodA() public virtual void MethodA() Console.WriteLine(BaseClass);Console.WriteLine(BaseClass); class Class1: BaseClassclass Class1: BaseClass public void MethodA() public void MethodA() Console.WriteLine(Class1);Console.WriteLine(Class1); class Class2: Class1class Class2: Class1 在在MainMa
21、in方法中執(zhí)行下列語句:方法中執(zhí)行下列語句: Class2 Class2 o = new Class2();o = new Class2(); o.MethodA(); o.MethodA(); 問:執(zhí)行結(jié)果是什么?問:執(zhí)行結(jié)果是什么? 19 19 4.2 4.2 版本控制版本控制 用用C#C#編寫方法時,如果在擴(kuò)充類中重寫基類的方法,編寫方法時,如果在擴(kuò)充類中重寫基類的方法, 需要用需要用overrideoverride聲明;要隱藏基類的方法,需要用聲明;要隱藏基類的方法,需要用newnew聲明,聲明, 這就是這就是C#C#進(jìn)行版本控制的依據(jù)。進(jìn)行版本控制的依據(jù)。 調(diào)用非虛擬方法時不會受到版
22、本的影響調(diào)用非虛擬方法時不會受到版本的影響 調(diào)用虛擬方法的實(shí)現(xiàn)部分可能會因擴(kuò)充類的重寫而影響執(zhí)調(diào)用虛擬方法的實(shí)現(xiàn)部分可能會因擴(kuò)充類的重寫而影響執(zhí) 行結(jié)果。行結(jié)果。 舉例:舉例: P83 P83 例例4-84-8 P84 P84 例例4-94-9 20 20 4.2 4.2 版本控制(續(xù))版本控制(續(xù)) 調(diào)用原則:調(diào)用繼承的最后實(shí)現(xiàn)部分的方法調(diào)用原則:調(diào)用繼承的最后實(shí)現(xiàn)部分的方法 P85 P85 例例4-104-10 C#C#允許派生類包含與基類方法名稱相同的方法,規(guī)則如下:允許派生類包含與基類方法名稱相同的方法,規(guī)則如下: 1)1) 基類方法必須聲明為基類方法必須聲明為virtualvirtu
23、al 2)2)若派生類中方法前無若派生類中方法前無newnew或或overrideoverride關(guān)鍵字,方法執(zhí)行按存關(guān)鍵字,方法執(zhí)行按存 在在newnew關(guān)鍵字一樣執(zhí)行關(guān)鍵字一樣執(zhí)行 3)3)若派生類中方法前帶若派生類中方法前帶newnew關(guān)鍵字,則此方法被定義為獨(dú)立于關(guān)鍵字,則此方法被定義為獨(dú)立于 基類的方法基類的方法 4)4)若派生類中方法前帶若派生類中方法前帶overrideoverride關(guān)鍵字,則派生類調(diào)用此方法,關(guān)鍵字,則派生類調(diào)用此方法, 而非基類的方法。而非基類的方法。 5)5)可從派生類中使用可從派生類中使用basebase關(guān)鍵字調(diào)用基類方法。關(guān)鍵字調(diào)用基類方法。 21 2
24、1 補(bǔ)充知識:補(bǔ)充知識:C#C#面試題面試題 public class A public class A public A() public A() Console.WriteLine( Console.WriteLine(“A A”);); public virtual void Fun() public virtual void Fun() Console.WriteLine(A.Fun()Console.WriteLine(A.Fun() ); ); public class B: A public class B: A public B() public B() Console.Wri
25、teLine( Console.WriteLine(“B B”); ); public new void Fun() 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()() 22 22 4.3 4.3 接口接口 接口的主要特點(diǎn)是
26、只有聲明部分,沒有實(shí)現(xiàn)部分。接口的主要特點(diǎn)是只有聲明部分,沒有實(shí)現(xiàn)部分。 接口成員的實(shí)現(xiàn)是通過類完成的。接口成員的實(shí)現(xiàn)是通過類完成的。 定義在接口中的方法都是定義在接口中的方法都是publicpublic的。的。 使用使用interfaceinterface關(guān)鍵字聲明一個接口。常用的語法是:關(guān)鍵字聲明一個接口。常用的語法是: 訪問修飾符訪問修飾符 interface interface 接口名稱接口名稱 / / 接口體接口體 一般情況下,以大寫的一般情況下,以大寫的“I I”開頭指定接口名,表明這是開頭指定接口名,表明這是 一個接口。一個接口。 需要在不相關(guān)的類中實(shí)現(xiàn)同樣的功能時,可以使用接口
27、。需要在不相關(guān)的類中實(shí)現(xiàn)同樣的功能時,可以使用接口。 23 23 4.3 4.3 接口接口 P88 P88 例例4-114-11 顯示方式實(shí)現(xiàn)接口顯示方式實(shí)現(xiàn)接口 例例4-124-12 注意:顯示實(shí)現(xiàn)接口時,不能通過類的實(shí)例進(jìn)行訪問,注意:顯示實(shí)現(xiàn)接口時,不能通過類的實(shí)例進(jìn)行訪問, 而必須使用接口實(shí)例。而必須使用接口實(shí)例。 通過接口實(shí)現(xiàn)多繼承通過接口實(shí)現(xiàn)多繼承 例例4-134-13 24 24 補(bǔ)充知識:補(bǔ)充知識:C#C#面試題面試題 不定項(xiàng)選擇題不定項(xiàng)選擇題 以下敘述正確的是:以下敘述正確的是: A. A. 接口中可以有虛方法。接口中可以有虛方法。 B. B. 一個類可以實(shí)現(xiàn)多個接口。一個類
28、可以實(shí)現(xiàn)多個接口。 C. C. 接口不能被實(shí)例化。接口不能被實(shí)例化。 D. D. 接口中可以包含已實(shí)現(xiàn)的方法。接口中可以包含已實(shí)現(xiàn)的方法。 B、C (2)(2)以下敘述正確的是:以下敘述正確的是: A. A. 接口和抽象類一樣均只能聲明,而不能有實(shí)現(xiàn)部分。接口和抽象類一樣均只能聲明,而不能有實(shí)現(xiàn)部分。 B. B. 類可以繼承多個接口,但僅能從一個抽象類或其它類型的單個類繼類可以繼承多個接口,但僅能從一個抽象類或其它類型的單個類繼 承。承。 C. C. 接口中可以定義屬性、方法和事件,但只聲明不實(shí)現(xiàn)。接口中可以定義屬性、方法和事件,但只聲明不實(shí)現(xiàn)。 D. D. 類的多繼承可以通過接口實(shí)現(xiàn)。類的多
29、繼承可以通過接口實(shí)現(xiàn)。 B、C、D 25 25 4.4 4.4 委托委托 類似與類似與C+C+中的函數(shù)指針,但有很大不同中的函數(shù)指針,但有很大不同 委托的聲明委托的聲明 例如:例如: publicpublic delegatedelegate void FuncDelegatevoid FuncDelegate(stringstring strstr);); 委托的使用委托的使用 具體內(nèi)容不再詳細(xì)講述具體內(nèi)容不再詳細(xì)講述 26 26 4.5 4.5 序列化與反序列化序列化與反序列化 序列化序列化 獲取對象并將其狀態(tài)信息轉(zhuǎn)換為可存儲或可傳輸形式的過程。獲取對象并將其狀態(tài)信息轉(zhuǎn)換為可存儲或可傳輸形
30、式的過程。 反序列化反序列化 將對象還原回序列化之前的內(nèi)容。將對象還原回序列化之前的內(nèi)容。 序列化和反序列化是一個互逆的過程。序列化和反序列化是一個互逆的過程。 .NET Framework.NET Framework提供的兩種序列化技術(shù)提供的兩種序列化技術(shù) 二進(jìn)制序列化二進(jìn)制序列化 XMLXML和和SOAPSOAP序列化序列化 27 27 4.5 4.5 序列化與反序列化序列化與反序列化 1 1、如何序列化一個類:在類的上方加上、如何序列化一個類:在類的上方加上SerializableSerializable特性即可。特性即可。 SerializableSerializable public
31、 class MyClass public class MyClass 2 2、二進(jìn)制序列化、二進(jìn)制序列化 MyClass user = new MyClass();MyClass user = new MyClass(); IFormatter formater = new BinaryFormatter(); IFormatter formater = new BinaryFormatter(); Stream stream = new FileStream(UserInfo.bin, FileMode.Create, Stream stream = new FileStream(User
32、Info.bin, FileMode.Create, FileAccess.Write, FileShare.None); FileAccess.Write, FileShare.None); formater.Serialize(stream, user);formater.Serialize(stream, user); stream.Close(); stream.Close(); 特點(diǎn):特點(diǎn): 二進(jìn)制序列化會將一個類的所有成員變量都進(jìn)行序列化,包括私有變量、二進(jìn)制序列化會將一個類的所有成員變量都進(jìn)行序列化,包括私有變量、 公共屬性、方法等。公共屬性、方法等。 28 28 4.5 4.5
33、 序列化與反序列化序列化與反序列化 3 3、二進(jìn)制反序列化、二進(jìn)制反序列化 IFormatter formatter = new BinaryFormatter();IFormatter formatter = new BinaryFormatter(); Stream stream = new FileStream(UserInfo.bin, Stream stream = new FileStream(UserInfo.bin, FileMode.Open, FileAccess.Read, FileShare.Read); FileMode.Open, FileAccess.Read,
34、FileShare.Read); MyClass c = (MyClass)formatter.Deserialize(stream);MyClass c = (MyClass)formatter.Deserialize(stream); stream.Close(); stream.Close(); 特點(diǎn):特點(diǎn): 反序列化后,對象反序列化后,對象c c與序列化之前的狀態(tài)完全相同。與序列化之前的狀態(tài)完全相同。 29 29 補(bǔ)充:二進(jìn)制序列化與反序列化舉例補(bǔ)充:二進(jìn)制序列化與反序列化舉例 保存窗體位置、顏色與數(shù)據(jù)庫連接信息設(shè)置保存窗體位置、顏色與數(shù)據(jù)庫連接信息設(shè)置 30 30 補(bǔ)充:二進(jìn)制序列化
35、與反序列化舉例補(bǔ)充:二進(jìn)制序列化與反序列化舉例 當(dāng)輸入服務(wù)器等信息、改變窗體前景色、位置后,退出應(yīng)用當(dāng)輸入服務(wù)器等信息、改變窗體前景色、位置后,退出應(yīng)用 程序,再次啟動,可看到仍然是退出前的狀態(tài)。程序,再次啟動,可看到仍然是退出前的狀態(tài)。 31 31 4.5 4.5 序列化與反序列化序列化與反序列化 4 4、XMLXML序列化序列化 (1 1)XML XML 序列化僅將對象的公共字段和屬性值序列化為序列化僅將對象的公共字段和屬性值序列化為XMLXML流,而不轉(zhuǎn)換流,而不轉(zhuǎn)換 方法、索引器、私有字段或只讀屬性(只讀集合除外)。方法、索引器、私有字段或只讀屬性(只讀集合除外)。 (2 2)XML
36、XML 序列化不包括類型信息,即不能保證序列化后的對象在被反序序列化不包括類型信息,即不能保證序列化后的對象在被反序 列化時,變?yōu)橥活愋偷膶ο?。列化時,變?yōu)橥活愋偷膶ο蟆?(3 3)XMLXML序列化的實(shí)現(xiàn)步驟序列化的實(shí)現(xiàn)步驟 Class1 user = new Class1();Class1 user = new Class1(); user.AccountName = aa;user.AccountName = aa; XmlSerializer mySerializer = new XmlSerializer(typeof(Class1);XmlSerializer mySerial
37、izer = new XmlSerializer(typeof(Class1); StreamWriter myWriter = new StreamWriter(UserInfo.xml);StreamWriter myWriter = new StreamWriter(UserInfo.xml); mySerializer.Serialize(myWriter, user);mySerializer.Serialize(myWriter, user); myWriter.Close();myWriter.Close(); 32 32 4.5 4.5 序列化與反序列化序列化與反序列化 (4
38、4)XMLXML反序列化的步驟反序列化的步驟 Class1 c;Class1 c; XmlSerializer mySerializer = new XmlSerializer(typeof(Class1);XmlSerializer mySerializer = new XmlSerializer(typeof(Class1); FileStream myFileStream =FileStream myFileStream = new FileStream(UserInfo.xml, FileMode.Open); new FileStream(UserInfo.xml, FileMode
39、.Open); c = (Class1) mySerializer.Deserialize(myFileStream);c = (Class1) mySerializer.Deserialize(myFileStream); myFileStream.Close();myFileStream.Close(); 注意:注意: 反序列化一個對象時不會調(diào)用構(gòu)造函數(shù),這一點(diǎn)與創(chuàng)建對象不同。反序列化一個對象時不會調(diào)用構(gòu)造函數(shù),這一點(diǎn)與創(chuàng)建對象不同。 33 33 4.6 4.6 泛型處理泛型處理 泛型(泛型(GenericGeneric)一般用在集合和在集合上運(yùn)行的方法)一般用在集合和在集合上運(yùn)行的方法
40、中。中。.NET.NET框架框架2.02.0以前的版本不支持泛型。以前的版本不支持泛型。 使用泛型具有以下明顯的使用泛型具有以下明顯的優(yōu)點(diǎn)優(yōu)點(diǎn): 1)1)可以避免以下兩個問題:內(nèi)部實(shí)現(xiàn)代碼冗余和困擾開發(fā)人可以避免以下兩個問題:內(nèi)部實(shí)現(xiàn)代碼冗余和困擾開發(fā)人 員的含混不清的編譯器錯誤提示員的含混不清的編譯器錯誤提示; ; 2)2)類型安全類型安全; ; 3)3)二進(jìn)制代碼重用二進(jìn)制代碼重用; ; 4)4)性能性能; ; 5)5)清晰性。清晰性。 34 34 4.6 4.6 泛型問題描述泛型問題描述 public class Stack public class Stack object m_Ite
41、ms; object m_Items; public void Push(object item) . public void Push(object item) . public object Pop() . public object Pop() . 使用舉例:使用舉例: Stack stack = new Stack();Stack stack = new Stack(); stack.Push(1);stack.Push(1); int number=(int)stack.Pop();int number=(int)stack.Pop(); stack.Push(stack.Push(
42、“strstr”);); string str=(string)stack.Pop();string str=(string)stack.Pop(); 35 35 基于基于ObjectObject的堆棧缺點(diǎn)的堆棧缺點(diǎn) 性能問題性能問題 值類型需頻繁地裝箱、拆箱,造成較多的垃圾碎片,增值類型需頻繁地裝箱、拆箱,造成較多的垃圾碎片,增 加垃圾回收的負(fù)擔(dān)加垃圾回收的負(fù)擔(dān) 引用類型需要強(qiáng)制類型轉(zhuǎn)換引用類型需要強(qiáng)制類型轉(zhuǎn)換 類型安全問題(更嚴(yán)重)類型安全問題(更嚴(yán)重) 編譯時任務(wù)類型都轉(zhuǎn)換成編譯時任務(wù)類型都轉(zhuǎn)換成objectobject,無法保證運(yùn)行時類型,無法保證運(yùn)行時類型 安全。安全。 例如:例如:
43、Stack stack = new Stack();Stack stack = new Stack(); stack.Push(“abc”); stack.Push(“abc”); int number = (int)stack.Pop();int number = (int)stack.Pop(); 36 36 4.6 4.6 泛型解決辦法泛型解決辦法 public class IntStack public class IntStack int m_Items;int m_Items; public void Push(int item) public void Push(int item
44、) . public int Pop() 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ù)麻煩! 37 37 基于基于Object的的 堆堆棧棧 IntStack StringStack 代碼冗余, 維護(hù)復(fù)雜
45、, 工作效率低 性能問題、 類型安全問 題 有沒有好的解決辦法? 有,泛型 38 38 解決方法采用泛型解決方法采用泛型 public class public class Stack Stack T m_Items; T m_Items; public void Push(T item) public void Push(T item) . public T Pop() public T Pop() . . 39 39 泛型是如何實(shí)現(xiàn)的?泛型是如何實(shí)現(xiàn)的? 在在.NET 2.0.NET 2.0中,泛型在中,泛型在ILIL(中間語言)和(中間語言)和CLRCLR 本身中具有本機(jī)支持本身中具有本
46、機(jī)支持 編譯泛型時,就像編譯類一樣,泛型僅保留編譯泛型時,就像編譯類一樣,泛型僅保留 一個一個占位符占位符。 而用特定類型實(shí)例化的泛型代碼,編譯時會而用特定類型實(shí)例化的泛型代碼,編譯時會 將泛型替換為實(shí)例化的特定類型。將泛型替換為實(shí)例化的特定類型。 40 40 泛型實(shí)現(xiàn)泛型實(shí)現(xiàn) public class Stack public class Stack T m_Items; T m_Items; public void Push(T item) . public void Push(T item) . public T Pop() . public T Pop() . 使用舉例:使用舉例: S
47、tack stack = new StackStack stack = new Stack stack.Push(1);stack.Push(1); int number = stack.Pop();int number = stack.Pop(); 41 41 泛型的定義和引用泛型的定義和引用 泛型定義代碼語法如下:泛型定義代碼語法如下: 訪問修飾符訪問修飾符返回類型返回類型 泛型支持類型泛型支持類型 泛型名稱泛型名稱 其中其中CLRCLR支持的泛型類、結(jié)構(gòu)、方法、接口和委托等。支持的泛型類、結(jié)構(gòu)、方法、接口和委托等。 泛型類定義舉例:泛型類定義舉例:class Nodeclass Node
48、 T data; T data; Node next; Node next; 例例4-19 4-19 引用泛型類引用泛型類 42 42 泛型的引用泛型的引用 泛型類定義舉例:泛型類定義舉例: void Swap(ref T item1, ref T item2)void Swap(ref T item1, ref T item2) T temp = item1; T temp = item1; item1 = item2; item1 = item2; item2 = temp; item2 = temp; 例例4-20 4-20 引用一個泛型方法引用一個泛型方法 程序舉例:使用泛型方法來實(shí)現(xiàn)
49、程序舉例:使用泛型方法來實(shí)現(xiàn)intint、doubledouble、floatfloat類型類型 的數(shù)據(jù)交換方法。的數(shù)據(jù)交換方法。 43 43 常用泛型常用泛型 凡是有對應(yīng)泛型類型的類就盡量不要使用早期提供的非泛凡是有對應(yīng)泛型類型的類就盡量不要使用早期提供的非泛 型類型的類。下面的泛型類型對應(yīng)于低版本提供的類型:型類型的類。下面的泛型類型對應(yīng)于低版本提供的類型: 泛型類泛型類 低版本提供的非泛型類低版本提供的非泛型類 ListList ArrayList ArrayList Dictionary Hashtable Dictionary Hashtable Queue Queue Queue
50、Queue Stack Stack Stack Stack SortedListSortedList SortedList SortedList 44 44 實(shí)驗(yàn)中用到的泛型實(shí)驗(yàn)中用到的泛型 SortedList SortedList :按鍵排序的鍵值對集合,是運(yùn)算:按鍵排序的鍵值對集合,是運(yùn)算 復(fù)雜度為復(fù)雜度為 O(log n) O(log n) 的二進(jìn)制搜索樹的二進(jìn)制搜索樹 。 常用方法:常用方法: AddAdd方法:將帶有指定鍵和值的元素添加到方法:將帶有指定鍵和值的元素添加到SortedList SortedList 中中 例如(注意:如果插入重復(fù)的鍵會產(chǎn)生異常):例如(注意:如果插入
51、重復(fù)的鍵會產(chǎn)生異常): SortedList openWith = new SortedListstring, SortedList openWith = new SortedList(); string(); openWith.Add(txt, notepad.exe); openWith.Add(txt, notepad.exe); openWith.Add(bmp, paint.exe); openWith.Add(bmp, paint.exe); 45 45 實(shí)驗(yàn)中用到的泛型(續(xù))實(shí)驗(yàn)中用到的泛型(續(xù)) 如何遍歷泛型列表中的每個鍵值對如何遍歷泛型列表中的每個鍵值對 SortedList
52、 list=new SortedList list=new SortedList ();SortedList (); list.Add(a, 123); list.Add(a, 123); list.Add(b, 234); list.Add(b, 234); list.Add(c, 456); list.Add(c, 456); foreach (string str in list.Keys) foreach (string str in list.Keys) Console.WriteLine(key is : + str + Console.WriteLine(key is : + s
53、tr + ,value is :+liststr.ToString();,value is :+liststr.ToString(); 46 46 實(shí)驗(yàn)中用到的泛型(續(xù))實(shí)驗(yàn)中用到的泛型(續(xù)) TryGetValueTryGetValue方法:獲取與指定的鍵相關(guān)聯(lián)的值方法:獲取與指定的鍵相關(guān)聯(lián)的值 。 例如:例如: string value = ; string value = ; if (openWith.TryGetValue(tif, out value)if (openWith.TryGetValue(tif, out value) Console.WriteLine(For key = tif, value = 0., value); Console.WriteLine(For key = tif, value = 0., value); else else Console.WriteLine(Key = tif is not found.); Console.WriteLine(Key = tif is not found.); 47 47 實(shí)驗(yàn)中用到的泛型(續(xù))實(shí)驗(yàn)中用到的泛型(續(xù)) ContainsKey ContainsKey 方法:確定方法:確定 Sorted
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2022年甘肅省甘南自治州公開招聘警務(wù)輔助人員筆試自考題2卷含答案
- 2022年四川省雅安市公開招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 2022年浙江省湖州市公開招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 晨會主持發(fā)言稿
- 廣西梧州市(2024年-2025年小學(xué)六年級語文)統(tǒng)編版隨堂測試(下學(xué)期)試卷及答案
- 2024年姿態(tài)控制推力器、推進(jìn)劑貯箱項(xiàng)目資金需求報告代可行性研究報告
- 《應(yīng)收款項(xiàng)新》課件
- 《稱贊教學(xué)》課件
- 2025年毛紡織、染整加工產(chǎn)品項(xiàng)目立項(xiàng)申請報告模范
- 2025年水乳型涂料項(xiàng)目提案報告模范
- 租房定金協(xié)議電子版本
- 人教版六年級上冊計算題專項(xiàng)練習(xí)1000題及答案
- 農(nóng)村文化建設(shè)培訓(xùn)
- 教育理念和教育方法
- 九小場所安全檢查表
- 第四代住宅百科知識講座
- 2022-2023學(xué)年佛山市禪城區(qū)六年級數(shù)學(xué)第一學(xué)期期末達(dá)標(biāo)測試試題含解析
- 《廣聯(lián)達(dá)培訓(xùn)教程》課件
- 揚(yáng)州育才小學(xué)2023-2024六年級數(shù)學(xué)上冊期末復(fù)習(xí)試卷(一)及答案
- 蔚藍(lán)時代有限公司員工培訓(xùn)現(xiàn)狀分析及改進(jìn)措施研究
- 浙江省溫州市2022-2023學(xué)年五年級上學(xué)期語文期末試卷(含答案)3
評論
0/150
提交評論