




已閱讀5頁,還剩62頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第7章C 面向?qū)ο缶幊袒A(chǔ) 2 本章要點(diǎn) 7 1類和繼承7 2多態(tài)7 3命名空間和程序集 3 7 1類繼承7 2訪問繼承的成員7 3隱藏基類成員7 4基類訪問7 5使用基類的引用7 6構(gòu)造函數(shù)的執(zhí)行7 7成員訪問修飾符7 8抽象成員7 9抽象類7 10密封類7 11靜態(tài)類7 12擴(kuò)展方法7 13外部方法 4 7 1類繼承 通過繼承我們可以定義一個(gè)新類 新類納入一個(gè)已經(jīng)聲明的類并進(jìn)行擴(kuò)展 可以使用一個(gè)已經(jīng)存在的類作為新類的基礎(chǔ) 已存在的類稱為基類 baseclass 新類稱為派生類 derivedclass 派生類成員的組成如下 自己聲明中的成員基類的成員要聲明一個(gè)派生類 需要在類名后加入基類規(guī)則說明 基類規(guī)則說明由冒號(hào)和后面跟著用作基類的名稱組成 派生類被描述為直接繼承自列出的基類派生類被描述為擴(kuò)展它的基類 因?yàn)樗嘶惖某蓡T 加上在它自己的聲明中的任何附加功能派生類不能刪除它所繼承的任何成員 5 7 1類繼承 6 7 2訪問繼承的成員 繼承的成員可以被訪問 就像它們是派生類自己聲明的一樣 例子 AccessBaseClassMember sln 7 7 2訪問繼承的成員 8 所有類都派生自object類 除了特殊的類object 所有的類都是派生類 即使它們沒有基類規(guī)格說明 類object是唯一的非派生類 因?yàn)樗抢^承層次結(jié)構(gòu)的基礎(chǔ) 沒有基類規(guī)格說明的類隱式地直接派生自object 不加基類規(guī)格說明只是指定object為基類的簡寫 9 所有類都派生自object類 關(guān)于類繼承的其他重要內(nèi)容如下 一個(gè)類聲明的基類規(guī)格說明只能有一個(gè)單獨(dú)的類 這稱為單繼承 雖然類只能直接繼承一個(gè)基類 但繼承的層次沒有限制 也就是說 作為基類的類可以派生自另外一個(gè)類 而它又可以派生自另外一個(gè)類 一直下去 直至最終到object 10 7 3隱藏基類成員 雖然派生類不能刪除它繼承的任何成員 但它可以隱藏它們 要隱藏一個(gè)繼承的數(shù)據(jù)成員 需要聲明一個(gè)新的相同類型的成員 并使用相同的名稱通過在派生類中聲明新的帶有相同簽名的函數(shù)成員 可以隱藏或掩蓋繼承的函數(shù)成員要讓編譯器知道我們在故意隱藏繼承的成員 使用new修飾符 沒有它 程序可以成功編譯 但編譯器會(huì)警告隱藏了一個(gè)繼承的成員也可以隱藏靜態(tài)成員例子 MaskBaseMember sln 11 7 3隱藏基類成員 12 7 4基類訪問 有時(shí) 派生類需要訪問被隱藏的繼承成員 可以使用基類訪問表達(dá)式訪問隱藏的基類成員 基類訪問表達(dá)式由關(guān)鍵字base后面跟著一個(gè)點(diǎn)和成員的名稱組成 如下所示 13 7 4基類訪問 14 7 5使用基類的引用 派生類的實(shí)例由基類的實(shí)例加上派生類附加的成員組成 派生類的引用指向整個(gè)類對(duì)象 包括基類部分 如果有一個(gè)派生類對(duì)象的引用 就可以獲取該對(duì)象基類部分的引用 使用類型轉(zhuǎn)換運(yùn)算符把該引用轉(zhuǎn)換為基類類型 類型轉(zhuǎn)換運(yùn)算符放在對(duì)象引用的前面 由圓括號(hào)括起的要被轉(zhuǎn)換成的類名組成 例子 UseBaseReference sln 15 7 5使用基類的引用 16 虛方法和覆寫方法 前面我們看到 當(dāng)使用基類引用訪問派生類對(duì)象時(shí) 得到的是基類的成員 虛方法可以使基類的引用訪問 升至 派生類內(nèi) 可以使用基類引用調(diào)用派生類的方法 只需要滿足下面的條件 派生類的方法和基類的方法有相同的簽名和返回類型基類的方法使用virtual標(biāo)注派生類的方法使用override標(biāo)注 17 虛方法和覆寫方法 18 虛方法和覆寫方法 關(guān)于virtual和override修飾符的重要事項(xiàng)如下所示 覆寫和被覆寫的方法必須有相同可訪問性 也就是說 被覆寫的方法不能是private等 而覆寫方法是public不能覆寫static方法或非虛方法方法 屬性和索引 以及事件 它們都可以被聲明為virtual和override 例子 VirtualMethod sln 19 覆寫標(biāo)記為override的方法 覆寫方法可以在繼承的任何層次出現(xiàn) 當(dāng)使用對(duì)象基類部分的引用調(diào)用一個(gè)覆寫的方法時(shí) 方法的調(diào)用被沿派生層次上溯執(zhí)行 一直到標(biāo)記為override的方法的最派生 most derived 版本 情況1 使用override聲明例子 Virtual override sln情況2 使用new聲明例子 Virtual override new sln 20 7 6構(gòu)造函數(shù)的執(zhí)行 在前面 我們看到構(gòu)造函數(shù)執(zhí)行代碼 準(zhǔn)備一個(gè)類以使用 這包括初始化類的靜態(tài)成員和實(shí)例成員 在這一部分 我們會(huì)看到派生類對(duì)象有一部分就是基類對(duì)象 要?jiǎng)?chuàng)建對(duì)象的基類部分 基類的一個(gè)構(gòu)造函數(shù)被作為創(chuàng)建實(shí)例過程的一部分被調(diào)用繼承層次鏈中的每個(gè)類在執(zhí)行它自己的構(gòu)造函數(shù)之前執(zhí)行它的基類的構(gòu)造函數(shù) 21 7 6構(gòu)造函數(shù)的執(zhí)行 當(dāng)一個(gè)實(shí)例被創(chuàng)建時(shí) 完成的第一件事是初始化對(duì)象的所有實(shí)例成員 在此之后 基類的構(gòu)造函數(shù)被調(diào)用 然后該類自己的構(gòu)造函數(shù)才被執(zhí)行 22 構(gòu)造函數(shù)初始化語句 默認(rèn)情況下 在對(duì)象被構(gòu)造時(shí) 基類的無參數(shù)構(gòu)造函數(shù)被調(diào)用 但構(gòu)造函數(shù)可以被重載 所以基類可能有一個(gè)以上的構(gòu)造函數(shù) 如果希望派生類使用一個(gè)指定的基類構(gòu)造函數(shù)而不是無參數(shù)構(gòu)造函數(shù) 必須在構(gòu)造函數(shù)初始化語句中指定它 有兩種形式的構(gòu)造函數(shù)初始化語句 第一種形式使用關(guān)鍵字base并指明使用哪一個(gè)基類構(gòu)造函數(shù)第二種形式使用關(guān)鍵字this并指明應(yīng)該使用當(dāng)前類的哪一個(gè)另外的構(gòu)造函數(shù)基類構(gòu)造初始化語句放在冒號(hào)后面 冒號(hào)緊跟著類的構(gòu)造函數(shù)聲明的參數(shù)列表 構(gòu)造函數(shù)初始化語句由關(guān)鍵字base和要調(diào)用的基類構(gòu)造函數(shù)的參數(shù)列表組成 23 構(gòu)造函數(shù)初始化語句 例子 BaseKeywordExample sln 24 類訪問修飾符 類可以被系統(tǒng)中其他類看到并訪問 術(shù)語可見的有時(shí)用作術(shù)語可訪問的 它們可以被互相訪問 類的可訪問性有兩個(gè)級(jí)別 public和internal 標(biāo)記為public的類可以被系統(tǒng)內(nèi)任何程序集中的代碼訪問標(biāo)記為internal的類只能被它自己所在的程序集內(nèi)的類看到這是默認(rèn)的可訪問級(jí)別 所以 只有在類的聲明中顯式地指定修飾符public 程序集外部的代碼才能訪問該類可以使用internal訪問修飾符顯式地聲明一個(gè)類為內(nèi)部的 25 類訪問修飾符 26 7 7成員訪問修飾符 到現(xiàn)在為止 我們只討論了類的可訪問性 成員 數(shù)據(jù)成員和函數(shù)成員 的可訪問性描述了類成員的可見性 聲明在類中的每個(gè)成員對(duì)系統(tǒng)的不同部分可見 這依賴于類聲明中指派給它的訪問修飾符 有7個(gè)成員訪問級(jí)別 公有的 public 私有的 private 受保護(hù)的 protected 內(nèi)部的 internal 受保護(hù)內(nèi)部的 protectedinternal 27 7 7成員訪問修飾符 28 7 7成員訪問修飾符 必須對(duì)每個(gè)成員指定成員訪問級(jí)別 如果不指定某個(gè)成員的訪問級(jí)別 它的隱式訪問級(jí)別為private成員不能比它的類更可訪問 也就是說 如果一個(gè)類的可訪問性限于它所在的程序集 那么類的成員個(gè)體也不能從程序集的外部看到 無論它們的訪問修飾符是什么 29 公有成員的可訪問性 public訪問級(jí)別是限制性最少的 所有的類 包括程序集內(nèi)部的類和外部的類都可以自由地訪問成員 30 私有成員的可訪問性 私有成員的可訪問性限制是最嚴(yán)格的 private類成員只能被它自己的類的成員訪問 它不能被其他的類訪問 包括繼承它的類然而 private成員能被嵌套在它的類中的成員訪問 31 受保護(hù)成員的可訪問性 protected訪問級(jí)別如同private訪問級(jí)別 除了一點(diǎn) 它允許派生自該類的類訪問該成員 32 內(nèi)部成員的可訪問性 標(biāo)記為internal的成員對(duì)程序集內(nèi)部的所有類可見 但對(duì)程序集外部的類不可見 33 受保護(hù)內(nèi)部成員的可訪問性 標(biāo)記為protectedinternal的成員對(duì)所有繼承該類的類以及所有程序集內(nèi)部的類可見 例子 MemberAccessModifier sln 34 7 8抽象成員 抽象成員是被設(shè)計(jì)來覆寫的函數(shù)成員 抽象成員有以下特征 它被用abstract修飾符標(biāo)記它沒有實(shí)現(xiàn)代碼塊 抽象成員的代碼塊被分號(hào)代替 35 7 8抽象成員 關(guān)于抽象成員的其他重要事項(xiàng)如下 盡管抽象方法必須在派生類中用相應(yīng)的方法覆寫 但不能把virtual修飾符附加到abstract修飾符就像虛方法 派生類中抽象方法的實(shí)現(xiàn)必須指定override修飾符抽象成員只能被聲明在抽象類中 36 7 8抽象成員 比較虛成員和抽象成員 37 7 9抽象類 抽象類只能被用作其他類的基類 抽象類就是被設(shè)計(jì)來被繼承用的 不能創(chuàng)建抽象類的實(shí)例抽象類使用abstract修飾符聲明 38 7 9抽象類 抽象類可以包含抽象成員 但不是必須的 抽象類的成員可以是抽象成員和普通帶實(shí)現(xiàn)的成員的任意組合抽象類可以派生自另一個(gè)抽象類 例子 AbstractClass slnAbstractExample sln 39 7 9抽象類 40 7 10密封類 密封類的重要事項(xiàng) 密封類只能被用作獨(dú)立的類 它不能被用作基類密封類使用sealed修飾符標(biāo)記 41 7 11靜態(tài)類 靜態(tài)類是這樣一種類 在類中所有的成員都是靜態(tài)的 靜態(tài)類用于分組不受實(shí)例數(shù)據(jù)影響的數(shù)據(jù)和函數(shù) 靜態(tài)類的一個(gè)普通的用途就是創(chuàng)建一個(gè)包含一組數(shù)學(xué)方法的數(shù)學(xué)庫 關(guān)于靜態(tài)類的重要事項(xiàng)如下 類本身必須標(biāo)記為static類的所有成員必須是靜態(tài)的類可以有一個(gè)靜態(tài)構(gòu)造函數(shù) 但沒有實(shí)例構(gòu)造函數(shù) 不能創(chuàng)建該類的實(shí)例不能繼承靜態(tài)類 它們是密封的 42 7 11靜態(tài)類 43 7 12擴(kuò)展方法 在迄今為止的內(nèi)容中 我們所看到的每個(gè)方法都和聲明它們的類相關(guān)聯(lián) C 3 0擴(kuò)展方法擴(kuò)展了這個(gè)邊界 允許編寫和聲明它的類之外的類關(guān)聯(lián)的方法 看下面MyData類 假如想追加一個(gè)更有用的方法 應(yīng)該怎么辦 44 7 12擴(kuò)展方法 45 7 12擴(kuò)展方法 如果有源代碼改源代碼然而 如果不能修改這個(gè)類 那就把這個(gè)類當(dāng)作一個(gè)基類并在派生自它的類中實(shí)現(xiàn)這個(gè)增加的方法如果不能訪問源代碼 或該類是密封的等原因 那就在另一個(gè)類中使用該類的公有成員編寫一個(gè)方法 46 7 12擴(kuò)展方法 47 7 12擴(kuò)展方法 然而 還使用擴(kuò)展方法特性來做 在參數(shù)聲明中的類型名前增加關(guān)鍵字this 把this關(guān)鍵字加到靜態(tài)類的靜態(tài)方法的第一個(gè)參數(shù)上 把方法從類的正規(guī)方法變?yōu)橐粋€(gè)類的擴(kuò)展方法 48 7 12擴(kuò)展方法 擴(kuò)展方法重要的事項(xiàng)如下 擴(kuò)展方法必須被聲明為static擴(kuò)展方法聲明所在的類也必須被聲明為static擴(kuò)展方法必須包含關(guān)鍵字this作為它的第一個(gè)參數(shù)類型 并在后面跟著它所擴(kuò)展的類的名稱 49 7 12擴(kuò)展方法 擴(kuò)展方法的例子 ExtensionMethod sln 50 7 13外部方法 外部方法 externalmethod 是在聲明中沒有實(shí)現(xiàn)的方法 其實(shí)常常是用C 語言之外的語言編寫的方法 外部方法使用extern修飾符標(biāo)記 而且在類的聲明沒有實(shí)現(xiàn) 它的實(shí)現(xiàn)被分號(hào)取代 51 7 13外部方法 聲明和實(shí)現(xiàn)的連接是依賴實(shí)現(xiàn)的 但常常使用DllImport特性完成例子 ExternalMethod sln 52 7 2多態(tài) 7 2 1理解多態(tài)7 2 2實(shí)現(xiàn)多態(tài) 53 什么是多態(tài) 多態(tài)性 polymorphism 是一項(xiàng)允許將父對(duì)象設(shè)置為和一個(gè)或多個(gè)子對(duì)象相等的技術(shù) 賦值之后 父對(duì)象就可以根據(jù)當(dāng)前賦值給它的子對(duì)象的特性以及不同的方式運(yùn)作 從字面上來理解 多態(tài)就是 多種形式 在計(jì)算機(jī)領(lǐng)域 它意味著可以利用動(dòng)態(tài)綁定技術(shù) 用相同名稱的方法來調(diào)用方法的不同具體實(shí)現(xiàn) 54 7 2 1理解多態(tài) 重載 overload 和多態(tài)無關(guān) 真正和多態(tài)相關(guān)的是覆蓋 override 當(dāng)派生類重新定義了基類的虛擬方法后 基類根據(jù)賦給它的不同的派生類引用 動(dòng)態(tài)地調(diào)用屬于派生類的對(duì)應(yīng)方法 這樣的方法調(diào)用在編譯期間是無法確定的 因此 這樣的方法地址是在運(yùn)行期綁定的 動(dòng)態(tài)邦定 結(jié)論就是 重載只是一種語言特性 與多態(tài)無關(guān) 與面向?qū)ο笠矡o關(guān) 55 7 2 2實(shí)現(xiàn)多態(tài) 例子 PolymorphismExample sln當(dāng)方法前使用了virtual關(guān)鍵字時(shí) 它就成為虛擬方法 虛擬方法是多態(tài)的基礎(chǔ) 在派生類中能夠 但不是必須 改變方法的執(zhí)行 改變基類中虛擬方法的過程叫做覆蓋 override 抽象方法與虛擬方法的區(qū)別在于 虛擬方法有實(shí)現(xiàn) 抽象方法沒實(shí)現(xiàn)抽象方法是隱含的虛擬 而且它必須被子類覆蓋 56 7 3命名空間和程序集 在這一部分 我們要在高層次上觀察了解編譯過程 編譯器接受源代碼文件并生成名稱為程序集的輸出文件 我們會(huì)詳細(xì)闡述程序集以及它們是如何生成和部署的 還會(huì)看到命名空間是如何幫助組織類型的 在我們看到的所有程序中 大部分都是聲明并使用它們自己的類 然而 在許多項(xiàng)目中 你會(huì)想使用來自其他程序集的類或者類型 這些其他程序集可能來自BCL BaseClassLibrary 或來自一個(gè)第三方賣主 或你自己創(chuàng)建了它們 這些程序集就稱為類庫 而且它們的程序集文件的名稱通常以 dll擴(kuò)展名結(jié)尾而不是 exe擴(kuò)展名 57 7 3命名空間和程序集 引用另一個(gè)程序集 58 7 3命名空間和程序集 mscorlib庫有一個(gè)類庫 我們幾乎先前的每一個(gè)示例都使用它 它就是包含Console類的那個(gè)庫 Console類被定義在mscorlib的程序員集中 在名稱為mscorlib dll的文件里 在這個(gè)程序集中 含有C 類型以及大部分 NET語言的基本類型的定義 在編譯C 程序時(shí) 它必須總是被引用 59 7 3命名空間和程序集 引用類庫 60 7 3命名空間和程序集 大家看下圖 由于程序集Superlib和UltraLib都含有名稱為SquareWidget的類的聲明 編譯器不知道實(shí)例化哪一個(gè) 這個(gè)問題怎么解決呢 61 7 3命名空間和程序集 如果我們有源代碼 我們就可以改變它們的類名來解決這些問題 但是 如果這些類型由不同的公司開發(fā)的 而且我們也沒有源代碼 那怎么辦 大家想像一下 在自己做開發(fā)的機(jī)器上含有不同公司生產(chǎn)的程序集 很可能有一定數(shù)量的類名重復(fù) 如果你不能把兩個(gè)程序集用在一個(gè)程序中 僅僅因?yàn)樗鼈兣銮捎邢嗤念惷?這是一種恥辱 但是 命名空間名稱幫助我們解決了這個(gè)問題 62 7 3命名空間和程序集 命名空間把一組類型分組在一起并給它們一個(gè)名稱 稱
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 描述一個(gè)成功的零售店鋪案例
- 保護(hù)地球的議論文11篇
- 中試平臺(tái)建設(shè)中的協(xié)同創(chuàng)新與跨界合作
- 非遺保護(hù)傳統(tǒng)工藝美術(shù)生產(chǎn)制作技術(shù)規(guī)程
- 環(huán)境影響評(píng)估實(shí)例分析
- 航空發(fā)動(dòng)機(jī)技術(shù)考點(diǎn)歸納題
- 風(fēng)電項(xiàng)目可行性研究報(bào)告(模板)
- 2025年音樂史與音樂理論考試試卷及答案
- 2025年舞蹈教育專業(yè)資格考試試卷及答案
- 2025年汽車維修工程師職稱考試試卷及答案
- 薛氏醫(yī)案所載傷寒鈐法總結(jié)
- MOOC 工程經(jīng)濟(jì)學(xué)原理-東南大學(xué) 中國大學(xué)慕課答案
- 湖北省固體礦產(chǎn)地質(zhì)勘查坑探工程 設(shè)計(jì)編寫要求
- 課件:深刻認(rèn)識(shí)和把握新質(zhì)生產(chǎn)力推進(jìn)我國經(jīng)濟(jì)高質(zhì)量發(fā)展
- XXX公司制基金章程范本
- 擴(kuò)大高水平對(duì)外開放課件
- 預(yù)制型橡膠跑道的施工方法
- 綜合醫(yī)院圍手術(shù)期管理
- 腦橋出血護(hù)理查房
- 高速鐵路客運(yùn)服務(wù)專業(yè)人才培養(yǎng)方案
- 《商業(yè)銀行信用卡業(yè)務(wù)監(jiān)督管理辦法》試卷及答案
評(píng)論
0/150
提交評(píng)論