C#第5章C#面向?qū)ο缶幊袒A(chǔ).ppt_第1頁
C#第5章C#面向?qū)ο缶幊袒A(chǔ).ppt_第2頁
C#第5章C#面向?qū)ο缶幊袒A(chǔ).ppt_第3頁
C#第5章C#面向?qū)ο缶幊袒A(chǔ).ppt_第4頁
C#第5章C#面向?qū)ο缶幊袒A(chǔ).ppt_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C#面向?qū)ο蟪绦蛟O(shè)計(jì),主講教師:胡 鵬 飛 個(gè)人郵箱: 教學(xué)郵箱:,2,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,5.1 繼承 5.2 抽象類與密封類 5.3 多態(tài)性,第5章 C#面向?qū)ο缶幊袒A(chǔ),3,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,5.1 繼承,5.1.1 繼承的定義 5.1.2 覆蓋 5.1.3 .NET Framework中重要的類 5.1.4 泛型,4,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,5.1 繼承,繼承是面向?qū)ο蟪绦蛟O(shè)計(jì)的主要特征之一,它可以讓您重用代碼,可以節(jié)省程序設(shè)計(jì)的時(shí)間。繼承就是在類之間建立一種相交關(guān)系,使得新定義的派生類的實(shí)例可以繼承已有的基類的特征和能力,而且可以加入新的特性或者是修改已有的特性建立起類的新層次。 現(xiàn)實(shí)世界中的許多實(shí)體之間不是相互孤立的,它們往往具有共同的特征也存在內(nèi)在的差別。人們可以采用層次結(jié)構(gòu)來描述這些實(shí)體之間的相似之處和不同之處。,5,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,6,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,5.1 繼承,對(duì)類進(jìn)一步細(xì)化,從而派生為更具體詳細(xì)的類,派生類除自動(dòng)具有基類中的所有成員以外,還可以添加自己所特有的屬性和行為,并可根據(jù)需要修改基類中個(gè)別行為的具體實(shí)現(xiàn)。 繼承體現(xiàn)了一般/特殊關(guān)系(派生類是基類的細(xì)化),保證了層次結(jié)構(gòu)的清晰性,且體現(xiàn)了模型/代碼重用的原則,體現(xiàn)了分類學(xué)基本方法。 繼承具有級(jí)聯(lián)效應(yīng)。修改基類成員會(huì)影響其派生類。,7,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,5.1.1 繼承的定義,從一個(gè)基類派生一個(gè)子類的語法是: 類修飾符 class 類名:基類類名 類的成員; 需要使用冒號(hào)(:),后跟基類的名字。冒號(hào)的意思相當(dāng)于“派生于”。 參看li5-1,P33,8,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,5.1.1 繼承的定義,一個(gè)類能夠從基類繼承成員。關(guān)于繼承,需要注意以下幾個(gè)重要的方面: 繼承是可傳遞的。如果B派生于A,并且C派生于B,那么C就繼承了B中聲明的成員,同時(shí)也繼承了A中聲明的成員。 派生類能夠擴(kuò)展它的基類。派生類可以添加同它繼承的成員一樣的新成員,但是這不能去掉一個(gè)繼承的成員的定義。,9,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,5.1.1 繼承的定義,不管它們是否聲明了可訪問性,構(gòu)造函數(shù)和析構(gòu)函數(shù)總是不能被繼承。 派生類可以通過用相同的名稱和簽名,聲明一個(gè)新的成員方法來覆蓋繼承的成員。 類可以聲明虛擬方法、屬性和索引,并且派生類可以覆蓋這些功能成員的執(zhí)行。這使得類可以展示多態(tài)性,此行為被功能成員調(diào)用實(shí)現(xiàn),而這個(gè)調(diào)用則要根據(jù)實(shí)例運(yùn)行時(shí)的類型,調(diào)用不同的方法成員。,10,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,保護(hù)成員 保護(hù)成員通過在成員聲明中使用protected修飾符來定義。為了方便派生類的訪問,但又不希望其他無關(guān)類隨意訪問,這時(shí)就可以使用protected修飾符,將成員聲明為保護(hù)的。,保護(hù)成員,為什么引入保護(hù)成員這個(gè)概念?,P29,11,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,5.1.2 覆蓋,覆蓋(override) 當(dāng)在子類中聲明了與基類相同名字的方法,而且,使用了相同的簽名時(shí),就稱派生類的成員覆蓋了基類中的成員。 C#中,基類中的功能成員默認(rèn)為不可覆蓋的,除非使用了virtual修飾。派生類中若要覆蓋相同簽名的基類功能成員,必須使用override修飾且重新定義其實(shí)現(xiàn)。 即使派生類覆蓋了基類功能成員,仍能使用“base.成員名”來訪問被覆蓋的功能成員。,P33,12,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,示例5-2類圖,13,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,5.1.2 覆蓋,覆蓋(override)和重載(overload)。 重載它是指允許存在多個(gè)同名函數(shù),而這些函數(shù)的簽名不同(或許參數(shù)個(gè)數(shù)不同,或許參數(shù)類型不同,或許兩者都不同),從而能夠處理方法的參數(shù)不同但操作相同的情況。 覆蓋是指子類重新定義基類的虛函數(shù),二者具有相同的簽名,它是面向?qū)ο笾卸鄳B(tài)的基礎(chǔ)。 派生類中可以同時(shí)對(duì)基類中的功能成員進(jìn)行重載和覆蓋。 不能覆蓋類的靜態(tài)成員。,14,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,new關(guān)鍵字 我們可以在派生類中定義新的成員方法,但如果無意中恰好定義了一個(gè)和基類完全一樣的方法,怎么辦? new關(guān)鍵字用來在派生類中隱藏從基類中繼承的單個(gè)成員。 參看例子5-2。,P34,15,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,override和new的區(qū)別?,override 表示重寫,用于繼承類對(duì)基類中虛成員的實(shí)現(xiàn)。 new 表示隱藏,聲明類的成員,表示隱藏了基類中同名的成員 。,16,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,1 Object類,所有.NET類都派生于System.Object類。在C#中在定義類時(shí)若沒有指定基類,編譯器自動(dòng)假設(shè)這個(gè)類派生于System.Object類。 System.Object類就成為C#中所以類的根。,5.1.3 .NET Framework中重要的類,P26,17,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,Object類常用方法,1)public virtual string ToString() 返回對(duì)象的字符串表示方式 2)public virtual bool Equals(object obj) 對(duì)對(duì)象的實(shí)例進(jìn)行比較 3)public static bool Equals(object objA, object objB) 對(duì)對(duì)象的實(shí)例進(jìn)行比較 4)public static bool ReferenceEquals(object objA,object objB) 比較兩個(gè)引用是否指向同一對(duì)象 5)public Type GetType() 返回對(duì)象類型的詳細(xì)信息,參看Li5-3,18,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,裝箱(boxing)和拆箱(unboxing)是C#類型系統(tǒng)中重要的概念。它允許將任何類型的數(shù)據(jù)轉(zhuǎn)換為對(duì)象(object),同時(shí)也允許任何類型的對(duì)象轉(zhuǎn)換到與之兼容的數(shù)據(jù)類型,其實(shí)拆箱是裝箱的逆過程。 1裝箱轉(zhuǎn)換 裝箱轉(zhuǎn)換是指將一個(gè)值類型的數(shù)據(jù)隱式地轉(zhuǎn)換成一個(gè)對(duì)象類型(object)的數(shù)據(jù)。把一個(gè)值類型裝箱,就是創(chuàng)建一個(gè)object類型的實(shí)例,并把該值類型的值復(fù)制給該這個(gè)object。 例如:下面的兩條語句就執(zhí)行了裝箱轉(zhuǎn)換: int k=100; object obj=k; 上面的兩條語句中,第1條語句先聲明一個(gè)整型變量k并對(duì)其賦值,第2條語句則先創(chuàng)建一個(gè)object類型的實(shí)例obj,然后將k的值復(fù)制給obj。,裝箱和拆箱,19,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,在執(zhí)行裝箱轉(zhuǎn)換時(shí),也可以使用顯式轉(zhuǎn)換,如: int k=100; object obj=(object) k; 例:在程序中執(zhí)行裝箱轉(zhuǎn)換,程序代碼如下: using System; class BoxingDemo static void Main( ) Console.WriteLine(“執(zhí)行裝箱轉(zhuǎn)換:“); int k=200; object obj=k; k=300; Console.WriteLine(“obj=0“,obj); Console.WriteLine(“k=0“, k); 裝箱的作用就是使類型統(tǒng)一. 參看li5-4,裝箱和拆箱,20,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,2拆箱轉(zhuǎn)換 是指將一個(gè)對(duì)象類型的數(shù)據(jù)顯式地轉(zhuǎn)換成一個(gè)值類型數(shù)據(jù)。 拆箱操作包括分為兩步:首先檢查對(duì)象實(shí)例,確保它是給定值類型的一個(gè)裝箱值,然后把實(shí)例的值復(fù)制到值類型數(shù)據(jù)中。 例如:下面兩條語句就執(zhí)行了拆箱轉(zhuǎn)換: object obj=228; int k=(int)obj; 拆箱轉(zhuǎn)換需要(而且必須)執(zhí)行顯式轉(zhuǎn)換,這是它與裝箱轉(zhuǎn)換的不同之處。,裝箱和拆箱,21,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,例:在程序中使用拆箱轉(zhuǎn)換,程序代碼如下: using System class UnboxingDemo static void Main( ) int k=228; object obj=k; /裝箱轉(zhuǎn)換 int j=(int ) obj; /拆箱轉(zhuǎn)換 Console.WriteLine(“k=0tobj=1tj=2“, k, obj, j); 注意:裝箱與拆箱轉(zhuǎn)換是要損失性能的。,裝箱和拆箱,22,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,5.1.3 .NET Framework中重要的類,String類 String類是直接從object派生的封裝好的類類型,字符串類的實(shí)例表示統(tǒng)一的字符編碼標(biāo)準(zhǔn)字符串,它的功能非常強(qiáng)大、用途非常廣泛。,23,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,String類,System.String類專門用于存儲(chǔ)字符串,允許對(duì)字符串進(jìn)行許多操作。由于這種數(shù)據(jù)類型非常重要,C#提供了它自己的關(guān)鍵字:string,以便更容易的處理字符串,string關(guān)鍵字是預(yù)定義System.String類的簡(jiǎn)化的別名。 String類提供了許多方法,可以實(shí)現(xiàn)例如替換字符、刪除空白和把字符變成大寫形式等功能。,P65,24,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,String類的方法,CompareTo 已重載。將此實(shí)例與指定的對(duì)象進(jìn)行比較。 Concat 已重載。連接 String 的一個(gè)或多個(gè)實(shí)例,或 Object 的一個(gè)或多個(gè)實(shí)例的值的 String 表示形式。 Copy 創(chuàng)建一個(gè)與指定的 String 具有相同值的 String 的新實(shí)例。 CopyTo 將指定數(shù)目的字符從此實(shí)例中的指定位置復(fù)制到 Unicode 字符數(shù)組中的指定位置。,25,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,String類的方法,IndexOf 已重載。報(bào)告 String 在此實(shí)例中的第一個(gè)匹配項(xiàng)的索引或一個(gè)或多個(gè)字符的索引。 IndexOfAny 已重載。報(bào)告指定 Unicode 字符數(shù)組中的任意字符在此實(shí)例中第一個(gè)匹配項(xiàng)的索引。 LastIndexOf 已重載。報(bào)告指定的 Unicode 字符或 String 在此實(shí)例中的最后一個(gè)匹配項(xiàng)的索引位置。,26,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,String類的方法,Substring 已重載。從此實(shí)例檢索子字符串。 ToLower 已重載。返回此 String 的小寫形式的副本。 ToUpper 已重載。返回此 String 的大寫形式的副本。 Trim 已重載。從此實(shí)例的開始位置和末尾移除一組指定字符的所有匹配項(xiàng)。,27,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,StringBuilder類,StringBuilder類表示可變字符串,功能不如String類強(qiáng)大,但StringBuilder類通過分配的內(nèi)存比需要的多,多數(shù)操作在內(nèi)存中進(jìn)行,因此在進(jìn)行替換、添加、插入或刪除字符串中的文本時(shí)效率非常高。 String 對(duì)象是不可改變的。每次使用 System.String 類中的方法之一或進(jìn)行運(yùn)算時(shí)(如賦值、拼接等)時(shí),都要在內(nèi)存中創(chuàng)建一個(gè)新的字符串對(duì)象,這就需要為該新對(duì)象分配新的空間。,P75,28,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,StringBuilder類,而 StringBuilder 則不會(huì)。在需要對(duì)字符串執(zhí)行重復(fù)修改的情況下,與創(chuàng)建新的 String 對(duì)象相關(guān)的系統(tǒng)開銷可能會(huì)非常昂貴。如果要修改字符串而不創(chuàng)建新的對(duì)象,則可以使用 System.Text.StringBuilder 類。例如,當(dāng)在一個(gè)循環(huán)中將許多字符串連接在一起時(shí),使用 StringBuilder 類可以提升性能。,參看li5-6,29,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,3 ArrayList類 ArrayList類與數(shù)組類似,但是有如下優(yōu)點(diǎn): 數(shù)組要想改變大小,必須重建一個(gè)數(shù)組,復(fù)制現(xiàn)有元素,然后對(duì)數(shù)組引用進(jìn)行更新。但ArrayList不用,它可以是不定大小的。 如果要從數(shù)組中移除一個(gè)元素,必須創(chuàng)建元素復(fù)本,然后將刪除位置后的所有元素向前移動(dòng)一個(gè)位置。 ArrayList不用,直接調(diào)用它的移除函數(shù)即可。 如果數(shù)組插入時(shí),需要將插入位置后的所有元素都向后移動(dòng),空出空間給新插入的元素。而ArrayList直接調(diào)用它的插入函數(shù)即可。 注意引入 System.Collections命名空間,5.1.3 .NET Framework中重要的類,P50,30,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,ArrayList類的方法,Add 將對(duì)象添加到 ArrayList 的結(jié)尾處。 Insert 將元素插入 ArrayList 的指定索引處。 Remove 從 ArrayList 中移除特定對(duì)象的第一個(gè)匹配項(xiàng)。 RemoveAt 移除 ArrayList 的指定索引處的元素。 IndexOf 返回 ArrayList 或它的一部分中某個(gè)值的第一個(gè)匹配項(xiàng)的從零開始的索引。 Sort 對(duì) ArrayList 或它的一部分中的元素進(jìn)行排序。 Clear 從 ArrayList 中移除所有元素。 參看li5-7,31,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,4.Queue類 Queue類表示對(duì)象的先進(jìn)先出集合。 Queue類常見操作 Enqueue 將對(duì)象添加到 Queue 的結(jié)尾處。 Dequeue 移除并返回位于 Queue 開始處的對(duì)象。 Peek 返回位于 Queue 開始處的對(duì)象但不將其移除。 Clear 從 Queue 中移除所有對(duì)象。,5.1.3 .NET Framework中重要的類,參看li5-8,32,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,5.Stack類 Stack類表示對(duì)象的先進(jìn)先出集合。 Stack類常見操作 Push 將對(duì)象插入 Stack 的頂部。 Pop 移除并返回位于 Stack 頂部的對(duì)象。 Peek 返回位于 Queue 開始處的對(duì)象但不將其移除。 Clear 從 Stack 中移除所有對(duì)象。,5.1.3 .NET Framework中重要的類,參看li5-9,33,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,5. Hashtable類 Hashtable類表示鍵/值對(duì)的集合,這些鍵/值對(duì)根據(jù)鍵的哈希代碼進(jìn)行組織。 Hashtable類常見操作 Add 將帶有指定鍵和值的元素添加到 Hashtable 中。 Remove 從 Hashtable 中移除帶有指定鍵的元素。 Clear 從 Hashtable 中移除所有對(duì)象。,5.1.3 .NET Framework中重要的類,參看li5-10,34,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,6. SortedList 類 SortedList 類表示鍵/值對(duì)的集合,這些鍵值對(duì)按鍵排序并可按照鍵和索引訪問。 SortedList類的重要屬性 Count 獲取包含在 SortedList元素的數(shù)目。 Capacity 獲取或設(shè)置 SortedList 的容量。 Keys 獲取 SortedList 中的鍵。 Values 獲取 SortedList 中的值。,5.1.3 .NET Framework中重要的類,參看li5-11,35,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,SortedList類常見操作 Add 將帶有指定鍵和值的元素添加到 SortedList。 Remove 從 Hashtable 中移除帶有指定鍵的元素。 GetByIndex 獲取 SortedList 的指定索引處的值。 SetByIndex 替換 SortedList 中指定索引處的值。 GetKey 獲取 SortedList 的指定索引處的鍵。 IndexOfKey 返回 SortedList 中指定鍵的從零開始的索引。 IndexOfValue 返回指定的值在 SortedList 中第一個(gè)匹配項(xiàng)的從零開始的索引。 Clear 從 Hashtable 中移除所有對(duì)象。,5.1.3 .NET Framework中重要的類,參看li5-11,36,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,5.1.4 泛型,所謂泛型:即通過參數(shù)化類型來實(shí)現(xiàn)在同一份代碼上操作多種數(shù)據(jù)類型。泛型編程是一種編程范式,它利用“參數(shù)化類型”將類型抽象化,從而實(shí)現(xiàn)更為靈活的復(fù)用。 C#泛型賦予了代碼更強(qiáng)的類型安全,更好的復(fù)用,更高的效率,更清晰的約束。 參看li5-12,37,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,上機(jī)作業(yè),按下面的類圖實(shí)現(xiàn)代碼,38,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,5.2 抽象類和密封類,5.2.1 抽象類 5.2.2 密封類,39,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,5.2.1 抽象類:abstract,抽象類是基類的一種特殊類型。除了擁有普通的類成員之外,還有抽象類成員。抽象類成員中的方法和屬性,只有聲明(使用關(guān)鍵字abstract),而沒有實(shí)現(xiàn)部分。由于對(duì)實(shí)例而言,沒有實(shí)現(xiàn)的成員是不合法的,所以抽象類永遠(yuǎn)也不能實(shí)例化。,P35,40,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,5.2.1 抽象類:abstract,這種不能實(shí)例化的類也有它的作用空間,它們可以在類層次結(jié)構(gòu)的上層,對(duì)于派生于該類的其他類而言,抽象類就確定了子類的基本結(jié)構(gòu)和意義,從而使程序框架更容易建立。 抽象類不能實(shí)例化。抽象類的用途是提供多個(gè)派生類可共享的基類的公共定義。,41,我學(xué)習(xí)我快樂!我快樂我學(xué)習(xí)!,5.2.1 抽象類,包含一個(gè)或多個(gè)抽象方法的類必須聲明為abstract,但是,抽象類可以包含非抽象的成員。從抽象類派生的類必須對(duì)基類中包含的所有抽象方法提供

溫馨提示

  • 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. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論