




已閱讀5頁,還剩42頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第8章繼承和多態(tài) 繼承和多態(tài)的基本概念派生類的聲明和使用訪問關(guān)鍵字this和base虛方法 重寫方法和隱藏方法抽象類和抽象方法密封類和密封方法接口的聲明和使用 8 1繼承和多態(tài)的基本概念 繼承允許重用現(xiàn)有類 基類 亦稱超類 父類 去創(chuàng)建新類 子類 亦稱派生類 的過程 子類將獲取基類的所有非私有數(shù)據(jù)和行為 子類可以定義其他數(shù)據(jù)或行為派生類具有基類的所有非私有數(shù)據(jù)和行為以及新類自己定義的所有其他數(shù)據(jù)或行為 即子類具有兩個有效類型 子類的類型和它繼承的基類的類型對象可以表示多個類型的能力稱為多態(tài)性 例8 1 多態(tài)性示例 8 2派生類 在聲明派生類時 在類名稱后放置一個冒號 然后在冒號后指定要從中繼承的類 即基類 派生類可以訪問基類的非private成員 但是派生類的屬性和方法不能直接訪問基類的private成員 派生類可以影響基類private成員的狀態(tài)改變 但只能通過基類提供并由派生類繼承的非private的屬性和方法來改變C 不支持多重繼承 即一個派生類只能繼承于一個基類 繼承 父類 子類 繼承也可以說是一種包含關(guān)系 繼承類的繼承性類的繼承性是指一個類定義既可以具有其他類的數(shù)據(jù)成員 屬性成員 方法成員等 也可以使其他類具有自己的數(shù)據(jù)成員 屬性成員 方法成員等 在類的繼承中 被繼承的類叫基類或父類 繼承的類叫派生類或子類 人類的繼承關(guān)系 一般人類 Person 具有年齡 性別 姓名等特征學生 也是人 除了具有一般人的特征之外 還具有學號 就讀學校 入學時間 考試成績等特征 例8 2 派生類示例 創(chuàng)建基類Person 包含2個數(shù)據(jù)成員name和age 1個具有2個參數(shù)的構(gòu)造函數(shù) 創(chuàng)建派生類Student 包含1個數(shù)據(jù)成員studentID 1個具有3個參數(shù)的派生類構(gòu)造函數(shù)并用 base 調(diào)用基類構(gòu)造函數(shù) Person 一般人 Student 學生類 Name LiuLiGender F Age 21 Name WangDanGender M Age 42 Name LuSanGender F Age 38 Name Zhang3Gender F Age 18Score 88 0 Name Li4Gender M Age 17Score 92 0 父類 子類 練習 辨認以下類別的父子關(guān)系 1汽車 交通工具 飛機2運動用品 球類 籃球 足球練習 列舉出一個 汽車 類的子類 不使用繼承設計類 人類和學生類 classPerson publicintage publicstringname publicvoidsleep publicvoideat classStudent publicintage publicstringname publicvoidsleep publicvoideat publicvoidstudy 成員需要重新定義 使用繼承機制可以避免相同成員的重復定義 定義派生類1 派生類定義格式派生類通常定義的語法格式為 類修飾符class類名 基類 類體 指定基類 父類 基類定義如下 publicclassStudent publicstringid publicstringname publicstringsex publicbyteage publicstringShow return 學號 id 姓名 name n性別 sex 年齡 age 派生類定義如下 publicclassStudent 1 Student publicbytescore1 score2 publicuintTotal return uint score1 uint score2 publicfloatAverage return float score1 score2 2 例 使用繼承的 學生類 定義 classPerson publicintage publicstringname publicvoidsleep publicvoideat classStudent Person publicintclassId 班別編號publicintscore 學生成績publicvoidstudy 首先定義基類 包含共有的成員 Student類繼承于Person類 派生類的對象自動擁有父類的成員 classPerson publicintage publicstringname publicvoidsleep publicvoideat classStudent Person publicintclassId 班別編號publicintscore 學生成績publicvoidstudy Studentzhang3 newStudent zhang3 age 20 Student類型的對象的成員 agenamesleep eat classIdscorestudy 繼承的成員 特有的成員 練習1 根據(jù)提示補充程序 usingSystem publicclassParentClass publicParentClass Console WriteLine ParentConstructor publicvoidprint Console WriteLine IamaParentClass publicclassChildClass public 子類的初始化 Console WriteLine ChildConstructor publicstaticvoidMain 調(diào)用Print方法 父子關(guān)系 調(diào)用父類的方法 基類在派生類初始化之前自動初始化 2 protected訪問修飾符的作用根據(jù)面向?qū)ο蟪绦蛟O計封裝性要求 類中的數(shù)據(jù)成員通常是不允許直接訪問的 因此數(shù)據(jù)成員一般不使用public修飾符 而使用protected或private修飾符 使對數(shù)據(jù)成員的訪問必須通過public的屬性或方法實現(xiàn) 在類的繼承中 作為基類的數(shù)據(jù)成員通常使用protected修飾符 而不使用private修飾符 因為如果在基類中使用private修飾符聲明數(shù)據(jù)成員 則其成員將不允許派生類成員訪問 而protected修飾符 既能保證數(shù)據(jù)成員不被直接訪問 又允許其派生類成員訪問 3 創(chuàng)建派生類對象基類與派生類定義完成后 用派生類聲明的對象 將包含基類的成員 除了構(gòu)造函數(shù) 因此 派生類對象可以直接訪問基類成員 例如 Student 1subS newStudent 1 設置派生類繼承的基類數(shù)據(jù)成員值subS SetStudent 2005001 張三 女 21 設置派生類自身數(shù)據(jù)成員值subS SetStudent 1 90 100 subS Show 調(diào)用派生類繼承的基類方法 4 構(gòu)造函數(shù)的調(diào)用在創(chuàng)建派生類對象時 調(diào)用構(gòu)造函數(shù)的順序是先調(diào)用基類構(gòu)造函數(shù) 再調(diào)用派生類的構(gòu)造函數(shù) 以完成為數(shù)據(jù)成員分配內(nèi)存空間并進行初始化的工作 如果派生類的基類本身是另一個類的派生類 則構(gòu)造函數(shù)的調(diào)用次序按由高到低順序依次調(diào)用 例如 假設A類是B類的基類 B類是C類的基類 則創(chuàng)建C類對象時 調(diào)用構(gòu)造函數(shù)的順序為 先調(diào)用A類的構(gòu)造函數(shù) 再調(diào)用B類的構(gòu)造函數(shù) 最后調(diào)用C類的構(gòu)造函數(shù) 密封類C 中有一種類叫密封類 密封類是不允許其他類繼承的類 Convert類就是一個密封類 定義密封類需要使用sealed關(guān)鍵字 其格式為 訪問修飾符sealedclass類名稱 例如 publicsealedclassSealedClass publicstringmethod return 我是密封類 C 還允許將一個非密封類定義中的某個方法聲明為密封方法 一旦方法被聲明為密封方法 將不允許在派生類中重載該方法 關(guān)于派生類中重載基類方法 將在下節(jié) 多態(tài)性 中介紹 例如 publicclassSealedMethod publicsealedstringSMethod return 我是一個密封方法 usingSystem classAnimal protecteddoubleweight 0 publicvoidEat doublex weight x 0 5 if weight 100 weight 100 publicdoublegetWeight returnweight classDog Animal publicDog doublew weight w 0 8 publicvoidDrink doublex weight x 0 2 if weight 100 weight 100 classProgram publicstaticvoidMain Dogd newDog 80 Console WriteLine d getWeight d Eat 20 Console WriteLine d getWeight d Drink 80 Console WriteLine d getWeight d Eat 300 Console WriteLine d getWeight 8 2 2訪問關(guān)鍵字this和base this關(guān)鍵字引用類的當前實例 靜態(tài)成員方法中不能使用this關(guān)鍵字 this關(guān)鍵字只能在實例構(gòu)造函數(shù) 實例方法或?qū)嵗L問器中使用base關(guān)鍵字用于從派生類中訪問基類的成員 指定創(chuàng)建派生類實例時應調(diào)用的基類構(gòu)造函數(shù)調(diào)用基類上已被其他方法重寫的方法不能從靜態(tài)方法中使用base關(guān)鍵字 base關(guān)鍵字只能在實例構(gòu)造函數(shù) 實例方法或?qū)嵗L問器中使用 例8 3 訪問關(guān)鍵字this和base示例 p151 向基類構(gòu)造函數(shù)傳遞參數(shù)向基類構(gòu)造函數(shù)傳遞參數(shù) 必須通過派生類的構(gòu)造函數(shù)實現(xiàn) 其格式如下 public派生類構(gòu)造函數(shù)名 形參列表 base 向基類構(gòu)造函數(shù)傳遞的實參列表 base 是C 關(guān)鍵字 表示調(diào)用基類的有參構(gòu)造函數(shù) 傳遞給基類構(gòu)造函數(shù)的 實參列表 通常包含在派生類構(gòu)造函數(shù)的 形參列表 中 多態(tài)性多態(tài)性概述在類的繼承中 C 允許在基類與派生類中聲明具有同名的方法 而且同名的方法可以有不同的代碼 也就是說在基類與派生類的相同功能中可以有不同的具體實現(xiàn) 從而為解決同一問題提供多種途徑 多態(tài)性就是指在程序運行時 執(zhí)行的雖然是一個調(diào)用方法的語句 卻可以根據(jù)派生類對象的類型不同完成方法的不同的具體實現(xiàn) 在C 中可以通過多種途徑實現(xiàn)多態(tài)性 例 不同幾何圖形對象都需要計算面積的功能 getArea 方法 幾何圖形 長方形 圓 三角形 問題 有若干幾何圖形需要管理 有時需要統(tǒng)計這些圖形的數(shù)據(jù) 比如求不同形狀圖形的面積 8 2 3虛方法 重寫方法和隱藏方法 在基類中使用關(guān)鍵字virtual定義虛方法 virtualmethod 然后派生類中使用關(guān)鍵字override來重寫方法 overridemethod 或使用關(guān)鍵字new來覆蓋方法 隱藏方法 重寫方法用相同的簽名重寫所繼承的虛方法 虛方法聲明用于引入新方法 而重寫方法或隱藏方法聲明則用于使現(xiàn)有的繼承虛方法專用化 通過提供該方法的新實現(xiàn) 調(diào)用虛方法時 將首先檢查該對象的運行時類型 并調(diào)用派生類中的該重寫成員 如果沒有派生類重寫該成員 則調(diào)用其原始成員默認情況下 C 方法是非虛擬的 不能重寫非虛方法除了類方法 還可以使用virtual關(guān)鍵字修飾的其他類成員以定義虛成員 包括 屬性 索引器或事件聲明 虛擬成員的實現(xiàn)可在派生類中使用關(guān)鍵字override來重寫 或使用關(guān)鍵字new來覆蓋 例8 4 虛方法 重寫方法和隱藏方法示例 虛方法1 聲明與基類同名的派生類方法在派生類中用new關(guān)鍵字聲明與基類同名的方法的格式如下 publicnew方法名稱 參數(shù)列表 2 聲明虛方法基類中的聲明格式 publicvirtual方法名稱 參數(shù)列表 派生類中的聲明格式 publicoverride方法名稱 參數(shù)列表 virtual方法 當方法中包含virtual修飾符時 方法稱為虛方法 否則 稱為 非虛方法 非虛方法的執(zhí)行功能是確定不變的虛方法的執(zhí)行可以被派生類改變 重新定義此虛方法時 要求方法名 參數(shù)類型和返回類型完全一致 參數(shù)名可以不同 并加上override修飾符 不能用virtual修飾符 例 管理簡單的計算機圖形信息 包括長方形 圓形等 可以統(tǒng)計圖形的面積 classShape charshapeType R C 約定圖形的類型 長方形 圓形等 doublew 長方形的寬doubleh 長方形的高doubleradio 圓形的半徑doublegetArea switch shapeType case A 長方形returnw h break case B 圓形return3 14 r r break 采用多分支語句分別執(zhí)行不同的代碼需要擴充不同的類型的時候較為麻煩 弊端 1 每一個對象占據(jù)同樣大小的內(nèi)存空間 對于小對象造成資源的浪費 2 增加類型時 工作量巨大 Shape圖形類 x y 中心點坐標virtualgetArea Rect長方形類length width長寬overridegetArea Circle圓形類radius半徑overridegetArea 虛函數(shù) 基類中使用virtual修飾 虛函數(shù) 派生類中的使用override修飾 usingSystem classShape 幾何形狀類 publicdoublex 0 y 0 publicvirtualdoublegetArea return0 0 計算面積 classRect Shape 長方形類 doublelength width 長寬publicRect doublel doublew length l width w publicoverridedoublegetArea returnlength width classCircle Shape 圓形類 doubleradius 半徑publicCircle doubler radius r publicoverridedoublegetArea return3 1416 radius radius classHello publicstaticvoidMain Shape p newShape 4 p 0 newRect 1 5 2 0 p 1 newCircle 2 0 p 2 newRect 3 0 2 5 p 3 newRect 1 2 0 8 計算所有圖形de面積doubleTotalArea 0 0 for inti 0 i 4 i TotalArea p i getArea Console WriteLine TotalArea 0 TotalArea 父類中用virtual修飾 子類中用override修飾 重寫 classHello publicstaticvoidMain Shape p newShape 4 p 0 newRect 1 5 2 0 p 1 newCircle 2 0 p 2 newRect 3 0 2 5 p 3 newRect 1 2 0 8 計算所有圖形總面積doubleTotalArea 0 0 for inti 0 i 4 i TotalArea p i getArea Console WriteLine TotalArea 0 TotalArea 子類對象可以隱式轉(zhuǎn)換為父類對象 不同類型的對象可以使用相同的名字調(diào)用 并且調(diào)用正確的版本 usingSystem classShape 幾何形狀publicdoublex 0 y 0 PublicdoublegetArea return0 0 計算面積 classRect Shape 長方形doublelength width 長寬publicRect doublel doublew length l width w publicnewdoublegetArea returnlength width classCircle Shape 圓形doubleradius 半徑publicCircle doubler radius r publicnewdoublegetArea return3 1416 radius radius 0 classHello publicstaticvoidMain Shape p newShape 4 p 0 newRect 1 5 2 0 p 1 newCircle 2 0 p 2 newRect 3 0 2 5 p 3 newRect 1 2 0 8 計算所有圖形de面積doubleTotalArea 0 0 for inti 0 i 4 i TotalArea p i getArea Console WriteLine TotalArea 0 TotalArea 父類中不用virtual修飾 子類需要使用new修飾符 虛方法實例應用 趁熱打鐵 我們來解讀書上153頁的例8 4練習 如何通過虛方法實現(xiàn)計算機圖形的周長的統(tǒng)計計算 長方形 圓 getgirth 方法 調(diào)用基類方法在派生類中聲明與基類同名的方法 也叫方法重載 在派生類重載基類方法后 如果想調(diào)用基類的同名方法 可以使用base關(guān)鍵字 例如 假定基類與派生類都有一個無參數(shù)Show方法 則在派生類中調(diào)用基類Show方法的代碼為 baseShow 調(diào)用基類Show方法 8 3抽象類和抽象方法 將關(guān)鍵字abstract置于關(guān)鍵字class的前面可以將類聲明為抽象類 抽象類不能實例化 抽象類一般用于提供多個派生類可共享的基類的公共定義 例如 類庫可以定義一個包含基本功能的抽象類 并要求程序員使用該庫通過創(chuàng)建派生類來提供自己的類實現(xiàn)抽象類與非抽象類相比 具有下列特征 抽象類不能直接實例化 對抽象類使用new運算符會導致編譯時錯誤 可以定義抽象類型的變量 但其值必須為null 或者是其派生的非抽象類的實例的引用允許 但不要求 抽象類包含抽象成員抽象類不能被密封當從抽象類派生非抽象類時 這些非抽象類必須實現(xiàn)所繼承的所有抽象成員 從而重寫那些抽象成員 例8 5 抽象類示例抽象類中通過將關(guān)鍵字abstract添加到實例方法的返回類型的前面可以定義抽象方法 abstractmethod 例8 6 抽象方法示例 抽象類與抽象方法為了實現(xiàn)多態(tài) 必須在基類中聲明虛方法 但有時基類中聲明的虛方法無法實現(xiàn)具體的功能 這時需要在基類中聲明抽象方法抽象類是指基類的定義中聲明不包含任何實現(xiàn)代碼的方法 實際上就是一個不具有任何具體功能的方法 這樣的方法唯一的作用就是讓派生類重寫 在基類定義中 只要類體中包含一個抽象方法 該類即為抽象類 在抽象類中也可以聲明一般的虛方法 1 聲明抽象類與抽象方法聲明抽象類與抽象方法均需使用關(guān)鍵字abstract 其格式為 publicabstractclass類名稱 publicabstract返回類型方法名稱 參數(shù)列表 抽象方法不是一般的空方法 抽象方法聲明時 沒有方法體 只有方法頭后跟一個分號 2 重載抽象方法當定義抽象類的派生類時 派生類自然從抽象類繼承抽象方法成員 并且必須重寫 重載 抽象類的抽象方法 這是抽象方法與虛方法的不同 因為對于基類的虛方法 其派生類可以不必重寫 重載 重載抽象類方法必須使用override關(guān)鍵字 重載抽象方法的格式為 pulbicoverride返回類型方法名稱 參數(shù)列表 其中 方法名稱與參數(shù)列表必須與抽象類中的抽象方法完全一致 abstractclassAnimal 基類Animal 抽象類 publicabstractvoidSayHello classDog Animal 派生類Dog publicoverridevoidSayHello 重寫SayHello Console WriteLine WowWow classCat Animal 派生類Cat publicoverridevoidSayHello 重寫SayHello Console WriteLine MewMew classTestClass staticvoidMain
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中醫(yī)養(yǎng)生保健在療養(yǎng)院的應用考核試卷
- 石棉制品在醫(yī)療器械的絕緣應用考核試卷
- 糖批發(fā)企業(yè)客戶關(guān)系維護與管理考核試卷
- 《續(xù)資治通鑒》:畢沅對北宋興衰的記錄及其價值探討
- 2025地下倉儲租賃合同
- 2025年不簽訂勞動合同或不履行合同義務的法律風險與后果分析
- 蘇教六年級數(shù)學上冊導學案
- 離婚協(xié)議模板#
- 二零二五廣州買賣二手房定金合同范例
- 平面設計服務合同模板
- 《基于寧德時代的財務報表的公司財務分析》4100字(論文)
- 湖南省長沙市雅禮實驗中學-主題班會-《陽光心態(tài)美麗青春》【課件】
- 提高單病種上報率
- The+Person+I+respect+高考應用文寫作+導學案 高三上學期英語一輪復習專項
- 2025年中考考前物理押題密卷(河北卷)(考試版A4)
- 臨床護理實踐指南2024版
- 人教版七年級下冊數(shù)學第七章平面直角坐標系-測試題及答案
- “煎炒烹炸”與中藥療效(安徽中醫(yī)藥大學)知道智慧樹章節(jié)答案
- 行政事業(yè)單位內(nèi)部控制規(guī)范專題講座
- 加油站卸油時跑冒油應急演練及方案
- 藥品供貨服務方案
評論
0/150
提交評論