電子教案-第5章多態(tài)性、繼承性、命名空間_第1頁
電子教案-第5章多態(tài)性、繼承性、命名空間_第2頁
電子教案-第5章多態(tài)性、繼承性、命名空間_第3頁
電子教案-第5章多態(tài)性、繼承性、命名空間_第4頁
電子教案-第5章多態(tài)性、繼承性、命名空間_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第5章 繼承性、多態(tài)性和命名空間 繼承性(inheritance)和多態(tài)性(polymorphism)是面向?qū)ο蟮闹匾獧C(jī)制,其提高了軟件模塊的可復(fù)用性和可擴(kuò)充性。在第4章中已經(jīng)介紹了面向?qū)ο蟮牧硪惶匦岳^承性。這一章我們將介紹了兩種C# 2008中的重要概念抽象類和密封類,它們顯示了C#語言的多態(tài)性。 C# 2008程序是通過使用名空間來組織的。其不僅可以是應(yīng)用程序的內(nèi)部結(jié)構(gòu)體系,同樣也可以是外部結(jié)構(gòu)體系。如果程序中的一些元素要被導(dǎo)出到其他程序,可以使用命名空間。程序中免不了會(huì)出現(xiàn)錯(cuò)誤,這時(shí)就會(huì)用到C#語言的異常處理機(jī)制。5.1 繼承機(jī)制 面向?qū)ο蟮闹匾獧C(jī)制之一繼承是可以使用以前建造類的方法和屬

2、性。通過簡單的程序代碼來建造功能強(qiáng)大的類,不僅會(huì)節(jié)省很多編程時(shí)間,而且還可以減少代碼出錯(cuò)的機(jī)會(huì)。5.1.1 繼承的概念 通過一個(gè)實(shí)際應(yīng)用問題,來講解類的繼承這個(gè)問題,如代碼所示。 【本示例參考:示例代碼Chap05NoUseInheritance】 在上面的程序中,定義了Person類和Student類,結(jié)果發(fā)現(xiàn)Student類包含了Person類的所有屬性和方法。在C# 2008語言中,只要表明Student類繼承了Person類,就不用在類Student中重復(fù)寫類Person中的代碼了。5.1.2 繼承的機(jī)制 子類對(duì)象中的成員變量的初始化實(shí)過程如下: (1)分配成員變量的存儲(chǔ)空間,并進(jìn)行默

3、認(rèn)的初始化。 (2)綁定構(gòu)造函數(shù)參數(shù),就是把new Person(實(shí)際參數(shù)列表)中所傳遞進(jìn)的參數(shù)賦值給構(gòu)造函數(shù)中的形式參數(shù)變量。 (3)如果有this()調(diào)用,則調(diào)用相應(yīng)的重載構(gòu)造方法。 (4)顯式或隱式追溯調(diào)用父類的構(gòu)造方法。 (5)進(jìn)行實(shí)例變量的顯式初始化操作,也就是執(zhí)行定義成員變量時(shí)就進(jìn)行賦值的語句。 (6)執(zhí)行當(dāng)前構(gòu)造函數(shù)體中的代碼。5.2 多態(tài)性 在面向?qū)ο蟮南到y(tǒng)中,多態(tài)性允許對(duì)一個(gè)對(duì)象進(jìn)行操作,由一個(gè)對(duì)象完成一系列的動(dòng)作,具體實(shí)現(xiàn)哪個(gè)動(dòng)作由系統(tǒng)負(fù)責(zé)解釋。在C# 2008中,多態(tài)性的定義是:同一操作作用于不同的類的實(shí)例,不同類將進(jìn)行不同的解釋,最后產(chǎn)生不同的執(zhí)行結(jié)果。其支持兩種類型的

4、多態(tài)性:編譯時(shí)多態(tài)性和運(yùn)行時(shí)多態(tài)性。編譯時(shí)多態(tài)性是通過重載來實(shí)現(xiàn)的,其根據(jù)傳遞的參數(shù)、返回的類型等信息決定實(shí)現(xiàn)何種操作。在第4章已經(jīng)介紹了。運(yùn)行時(shí)多態(tài)性是指直到系統(tǒng)運(yùn)行時(shí),才根據(jù)實(shí)際情況決定實(shí)現(xiàn)何種操作,其是通過虛方法來實(shí)現(xiàn)的。5.2.1 虛方法 虛方法是通過在方法聲明語句的訪問修飾符和返回類型之間放置virtual關(guān)鍵字來實(shí)現(xiàn)的。當(dāng)調(diào)用虛方法時(shí),運(yùn)行將確定調(diào)用對(duì)象是什么類的實(shí)例,并調(diào)用適當(dāng)?shù)母采w方法,通過override關(guān)鍵字來覆蓋。通過一段簡單的代碼如所示,來說明虛方法跟非虛方法的區(qū)別。 【本示例參考:示例代碼Chap05Difference】 運(yùn)行結(jié)果: A.F B.F B.G B.G

5、5.2.2 抽象類和抽象方法 抽象方法可以看成是沒有方法體的虛方法。其是必須被派生類覆蓋的方法。在C# 2008中是通過關(guān)鍵字abstract來實(shí)現(xiàn)的。如果類的任何一個(gè)方法都是抽象的,則該類也必須聲明為抽象的。 抽象類的用途是提供多個(gè)派生類可共享的基類的公共定義,并使用abstract關(guān)鍵字定義。先定義一個(gè)抽象類: abstract class MyClass 抽象類可以看成是接口和普通類的結(jié)合,代碼5-6演示了抽象方法的使用。5.2.3 抽象方法 抽象類中可以定義抽象方法,如果一個(gè)方法要聲明為抽象方法,則方法前加上abstract修飾符即可。抽象方法是一個(gè)新的虛方法,它不提供具體的方法實(shí)現(xiàn)代

6、碼。只能在抽象類中聲明抽象方法,對(duì)抽象方法,不能使用static或virtual修飾符,而且方法中不能有任何可執(zhí)行代碼,只要給出方法的原型就可以了。抽象類的派生類必須實(shí)現(xiàn)所有抽象方法,如代碼所示。 【本示例參考:示例代碼Chap05AbstractMethod2】5.2.4 密封類和密封方法 與override關(guān)鍵字連用的還有sealed關(guān)鍵字,sealed關(guān)鍵字用來表示密封的意思。在C# 2008中,密封類的作用是限制擴(kuò)展性和靈活性。先定義一個(gè)簡單的密封類: sealed class MyClass 當(dāng)程序中密封了某個(gè)類時(shí),其他類是不能繼承該類的,如代碼所示。 【本示例參考:示例代碼Chap

7、05SealedClass1】 5.2.5 方法的隱藏 【本節(jié)示例參考:示例代碼Chap05HidingMethod】 還有一種方法可以實(shí)現(xiàn)在派生類中的覆蓋,即new關(guān)鍵字。這種過程叫做方法的隱藏。但是,派生類和非抽象類的基類方法必須有相同的方法。代碼演示了如何實(shí)現(xiàn)方法的隱藏。 運(yùn)行結(jié)果: Study方法被調(diào)用 Person方法被調(diào)用 方法隱藏的作用就是可以改變基類的方法。如果一個(gè)派生類型被強(qiáng)制向上轉(zhuǎn)換為基類型,基類型的方法將被調(diào)用。5.3 類型的轉(zhuǎn)換 第3章講述了基本數(shù)據(jù)類型變量的類型轉(zhuǎn)換問題,其實(shí)對(duì)象類型轉(zhuǎn)換也差不多是一個(gè)道理。不過在處理對(duì)象之前,有時(shí)候還經(jīng)常對(duì)變量的類型進(jìn)行判斷,所以下面

8、從類型的判斷開始。5.3.1 is關(guān)鍵字is關(guān)鍵字可以檢查對(duì)象是否與特定的類型兼容。顯然,可以用它來判斷對(duì)象是否為給定的類型。定義格式為:operand is type在上述定義中,當(dāng)type是一個(gè)類,而operand也是該類型、或繼承了該類型、或封箱到該類型中時(shí)結(jié)果為true;當(dāng)type是一個(gè)接口類型,而operand也是該類型,或者執(zhí)行該接口的類型結(jié)果也為true;當(dāng)type是一個(gè)值類型,而operand也是該類型,或者被拆箱到該類型中時(shí)結(jié)果也為true。如下面的一個(gè)簡事例:If (newClass is object)執(zhí)行相應(yīng)的操作;else執(zhí)行相應(yīng)的操作;5.3.2 轉(zhuǎn)換機(jī)制值類型和引

9、用類型的根本區(qū)別在于在內(nèi)存中的存儲(chǔ)方式,值類型總是在內(nèi)存中的棧中存儲(chǔ),而引用類型卻是在堆棧中存儲(chǔ)。堆棧與棧的區(qū)別在于,當(dāng)定義一個(gè)值類型變量時(shí),會(huì)在棧中分配適當(dāng)大小的內(nèi)存,內(nèi)存中的這個(gè)空間用來存儲(chǔ)變量所含的值。引用變量也利用棧,但這時(shí)棧包含的知識(shí)對(duì)另一個(gè)內(nèi)存位置的引用,而不是實(shí)際值。這個(gè)位置是堆中的一個(gè)地址。值類型代表基本數(shù)據(jù)類型,分為三種簡單類型(基本數(shù)據(jù)類型)、結(jié)構(gòu)(用戶定義的值類型)和枚舉。而引用類型分為類、接口、數(shù)組和委托。在第2章已經(jīng)介紹了值類型間的顯示轉(zhuǎn)換和隱式轉(zhuǎn)換。這一小節(jié)中,將介紹引用類型間的轉(zhuǎn)換。代碼5-15演示了如何實(shí)現(xiàn)子類轉(zhuǎn)化為父類?!颈臼纠齾⒖迹菏纠aChap05Tra

10、nsformation1】5.3.3 as關(guān)鍵字 as關(guān)鍵字用于在兼容的引用類型之間執(zhí)行轉(zhuǎn)換,把一種類型轉(zhuǎn)換為指定的引用類型。與強(qiáng)制轉(zhuǎn)換不同as關(guān)鍵字并不會(huì)引發(fā)錯(cuò)誤。其基本格式為: operand as type 當(dāng)operand的類型是type類型、operand的類型可以隱式轉(zhuǎn)換為type類型、operand的類型可以封箱到類型type類型時(shí),operand的類型就會(huì)被轉(zhuǎn)換為相應(yīng)type類型,否則operand的類型會(huì)被賦予null。代碼演示了as關(guān)鍵字的使用。 注意:如果operand的類型可以顯示轉(zhuǎn)換為type,則operand的類型的結(jié)果就是null。 【本示例參考:示例代碼Chap

11、05TestAs】5.3.4 封箱(boxing)和拆箱(unboxing)第2章討論了值類型間的轉(zhuǎn)換,而上面的小節(jié)討論了引用類型間的轉(zhuǎn)換,同時(shí)介紹了兩者間的區(qū)別。封箱(boxing)和拆箱(unboxing),就是在任何值類型、引用類型和object類型間進(jìn)行轉(zhuǎn)換。1封箱(boxing)封箱是把值類型轉(zhuǎn)換為System.Object類型,或者轉(zhuǎn)換為由值類型執(zhí)行的接口類型。當(dāng)把一個(gè)值類型轉(zhuǎn)換一個(gè)System.Object類型,也就是創(chuàng)建一個(gè)System.Object類型實(shí)例并將這個(gè)值復(fù)制給這個(gè)object。2拆箱(unboxing)和封箱轉(zhuǎn)換正好相反,拆箱轉(zhuǎn)換是將一個(gè)對(duì)象類型顯示的轉(zhuǎn)換成一個(gè)值

12、類型,或是將一個(gè)接口類型顯示的轉(zhuǎn)換成一個(gè)執(zhí)行該接口的值類型,這種轉(zhuǎn)換是顯示進(jìn)行的,其語法類似于前面的顯示類型轉(zhuǎn)換。拆箱的過程分為兩步,首先檢查這個(gè)對(duì)象實(shí)例。然后把這個(gè)實(shí)例的值復(fù)制給值類型的變量。5.4 異常處理 C# 2008語言支持錯(cuò)誤處理和異常(exception)。異常處理是捕獲預(yù)期的和突發(fā)事件的技術(shù),其目的是在錯(cuò)誤發(fā)生之前,能夠事先預(yù)料錯(cuò)誤,使程序更可靠。異常定義了程序中遇到的非致命的錯(cuò)誤,而不是編譯時(shí)的語法錯(cuò)誤。5.4.1 異常處理基礎(chǔ) 異常用來表示在應(yīng)用程序執(zhí)行期間執(zhí)行間的錯(cuò)誤,以及其他意外行為。當(dāng)遇到下列情況時(shí),可能會(huì)引發(fā)異常: 操作資源不可用。 公共語言運(yùn)行庫遇到意外情況。 自

13、定義拋出異常。 在.NET Framework中,類Exception類表示基類異常,其他異常從其繼承而來。該類常用的屬性有StackTrace屬性,InnerException屬性,Message屬性,HelpLink屬性,Data屬性,Source屬性和TargetSite屬性。5.4.2 異常的捕獲理解了異常就可以捕獲異常,代碼演示了如何實(shí)現(xiàn)異常的捕獲?!颈臼纠齾⒖迹菏纠aChap05TestException】代碼異常捕獲:TestExceptionusing System;using System.Collections.Generic;using System.Linq;usin

14、g System.Text;namespace TestException class Program static void Main(string args) int myArray = new int4 1, 2, 3, 4 ; /錯(cuò)誤的賦值 myArray5 = 5; 5.4.3 throws關(guān)鍵字 在異常處理中,還有一個(gè)throws關(guān)鍵字,其作用也非常重要。為了詳細(xì)的了解該關(guān)鍵字,請(qǐng)從代碼開始講解。 【本節(jié)示例參考:示例代碼Chap05TestThrows1】 在上述的例子中,假設(shè)TestException類和MyException類不是同一個(gè)人寫的,寫TestException類的

15、人,在main方法中調(diào)用MyException類的數(shù)組時(shí)候,如何知道數(shù)組會(huì)出現(xiàn)異常情況呢?也只有知道了它會(huì)發(fā)生錯(cuò)誤,才能夠想到用trycatch語句去處理可能發(fā)生的異常。 5.4.4 finally關(guān)鍵字 【本節(jié)示例參考:示例代碼Chap05TestFinally】。 在trycatch語句后,還可以有一個(gè)finally語句,finally語句中的代碼塊不管異常是否被捕獲總是要執(zhí)行的,代碼演示了該關(guān)鍵字的使用。 運(yùn)行結(jié)果: 出現(xiàn)錯(cuò)誤了 程序執(zhí)行完畢5.4.5 異常的使用細(xì)節(jié) 當(dāng)使用異常的時(shí)候,必須注意: 一個(gè)方法被覆蓋時(shí),覆蓋它的方法必須拋出異常或異常的子類。 如果父類拋出多個(gè)異常,那么覆蓋方

16、法必須拋出那些異常的一個(gè)子集,也就是說,不能拋出新的異常。5.5 命名空間 微軟公司為程序開發(fā)人遠(yuǎn)提供了成千上萬的類組成類庫,如果不對(duì)這些類進(jìn)行分門別類的使用和存放,就會(huì)像開發(fā)人員不用文件夾去管理眾多的文件一樣,在使用的時(shí)候不僅極度困難和不方便,也極易出現(xiàn)類的命名沖突問題。在C# 2008中是通過引入命令空間機(jī)制,提供類的多層類命名空間,來解決上述問題。5.5.1 聲明命名空間 【本節(jié)示例參考:示例代碼Chap05Testnamespace】 命名空間是C#類、接口、委托、枚舉和其他類型的一個(gè)邏輯上的組合。其不僅在使用上靈活了很多,而且還解決了類型之間的命名沖突。命名空間是一種邏輯組合,而不是

17、物理組合。其聲明的基本格式: namespace qualified-identifier namespace-body ; 在上述聲明中,命名空間使用的關(guān)鍵字“namespace”,其后跟名字空間名和名字空間主體,還必須跟分號(hào)。5.5.2 導(dǎo)入命名空間 有了命令空間的基本知識(shí),那么在不同命令空間中的類是如何調(diào)用的了,請(qǐng)看代碼,【本示例參考:示例代碼Chap05Testnamespace2】。 當(dāng)編譯上述代碼時(shí),會(huì)出現(xiàn)錯(cuò)誤。原因在于:在Testnamespace類中,直接調(diào)用了Test類。編譯器認(rèn)為兩個(gè)類在同一個(gè)命令空間中,即類Test的完整名被認(rèn)為是Chap05.Test,所以找不到類Test。只要把“new Test().WriteInfo();”這一句改為“new Chap05.SonPath.Test().WriteInfo();”就可以通過編譯了。5.5.3 使用指示符 【本節(jié)示例參考:示例代碼Chap05】 使用指示符的目的是為了方便使用其他的命名空間中定義的命名空間和類型。其有兩種類型:別名使用指示符和命名空間使用指示符。命名空間使用指示符在上一小節(jié)已經(jīng)介紹。 別名使用指示符定

溫馨提示

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

評(píng)論

0/150

提交評(píng)論