第8章.繼承和多態(tài).ppt_第1頁(yè)
第8章.繼承和多態(tài).ppt_第2頁(yè)
第8章.繼承和多態(tài).ppt_第3頁(yè)
第8章.繼承和多態(tài).ppt_第4頁(yè)
第8章.繼承和多態(tài).ppt_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第8章繼承和多態(tài) 繼承和多態(tài)的基本概念派生類的聲明和使用訪問(wèn)關(guān)鍵字this和base虛方法 重寫方法和隱藏方法抽象類和抽象方法密封類和密封方法接口的聲明和使用 8 1繼承和多態(tài)的基本概念 繼承允許重用現(xiàn)有類 基類 亦稱超類 父類 去創(chuàng)建新類 子類 亦稱派生類 的過(guò)程 子類將獲取基類的所有非私有數(shù)據(jù)和行為 子類可以定義其他數(shù)據(jù)或行為派生類具有基類的所有非私有數(shù)據(jù)和行為以及新類自己定義的所有其他數(shù)據(jù)或行為 即子類具有兩個(gè)有效類型 子類的類型和它繼承的基類的類型對(duì)象可以表示多個(gè)類型的能力稱為多態(tài)性 例8 1 多態(tài)性示例 8 2派生類 在聲明派生類時(shí) 在類名稱后放置一個(gè)冒號(hào) 然后在冒號(hào)后指定要從中繼承的類 即基類 派生類可以訪問(wèn)基類的非private成員 但是派生類的屬性和方法不能直接訪問(wèn)基類的private成員 派生類可以影響基類private成員的狀態(tài)改變 但只能通過(guò)基類提供并由派生類繼承的非private的屬性和方法來(lái)改變C 不支持多重繼承 即一個(gè)派生類只能繼承于一個(gè)基類 繼承 父類 子類 繼承也可以說(shuō)是一種包含關(guān)系 繼承類的繼承性類的繼承性是指一個(gè)類定義既可以具有其他類的數(shù)據(jù)成員 屬性成員 方法成員等 也可以使其他類具有自己的數(shù)據(jù)成員 屬性成員 方法成員等 在類的繼承中 被繼承的類叫基類或父類 繼承的類叫派生類或子類 人類的繼承關(guān)系 一般人類 Person 具有年齡 性別 姓名等特征學(xué)生 也是人 除了具有一般人的特征之外 還具有學(xué)號(hào) 就讀學(xué)校 入學(xué)時(shí)間 考試成績(jī)等特征 例8 2 派生類示例 創(chuàng)建基類Person 包含2個(gè)數(shù)據(jù)成員name和age 1個(gè)具有2個(gè)參數(shù)的構(gòu)造函數(shù) 創(chuàng)建派生類Student 包含1個(gè)數(shù)據(jù)成員studentID 1個(gè)具有3個(gè)參數(shù)的派生類構(gòu)造函數(shù)并用 base 調(diào)用基類構(gòu)造函數(shù) Person 一般人 Student 學(xué)生類 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 父類 子類 練習(xí) 辨認(rèn)以下類別的父子關(guān)系 1汽車 交通工具 飛機(jī)2運(yùn)動(dòng)用品 球類 籃球 足球練習(xí) 列舉出一個(gè) 汽車 類的子類 不使用繼承設(shè)計(jì)類 人類和學(xué)生類 classPerson publicintage publicstringname publicvoidsleep publicvoideat classStudent publicintage publicstringname publicvoidsleep publicvoideat publicvoidstudy 成員需要重新定義 使用繼承機(jī)制可以避免相同成員的重復(fù)定義 定義派生類1 派生類定義格式派生類通常定義的語(yǔ)法格式為 類修飾符class類名 基類 類體 指定基類 父類 基類定義如下 publicclassStudent publicstringid publicstringname publicstringsex publicbyteage publicstringShow return 學(xué)號(hào) id 姓名 name n性別 sex 年齡 age 派生類定義如下 publicclassStudent 1 Student publicbytescore1 score2 publicuintTotal return uint score1 uint score2 publicfloatAverage return float score1 score2 2 例 使用繼承的 學(xué)生類 定義 classPerson publicintage publicstringname publicvoidsleep publicvoideat classStudent Person publicintclassId 班別編號(hào)publicintscore 學(xué)生成績(jī)publicvoidstudy 首先定義基類 包含共有的成員 Student類繼承于Person類 派生類的對(duì)象自動(dòng)擁有父類的成員 classPerson publicintage publicstringname publicvoidsleep publicvoideat classStudent Person publicintclassId 班別編號(hào)publicintscore 學(xué)生成績(jī)publicvoidstudy Studentzhang3 newStudent zhang3 age 20 Student類型的對(duì)象的成員 agenamesleep eat classIdscorestudy 繼承的成員 特有的成員 練習(xí)1 根據(jù)提示補(bǔ)充程序 usingSystem publicclassParentClass publicParentClass Console WriteLine ParentConstructor publicvoidprint Console WriteLine IamaParentClass publicclassChildClass public 子類的初始化 Console WriteLine ChildConstructor publicstaticvoidMain 調(diào)用Print方法 父子關(guān)系 調(diào)用父類的方法 基類在派生類初始化之前自動(dòng)初始化 2 protected訪問(wèn)修飾符的作用根據(jù)面向?qū)ο蟪绦蛟O(shè)計(jì)封裝性要求 類中的數(shù)據(jù)成員通常是不允許直接訪問(wèn)的 因此數(shù)據(jù)成員一般不使用public修飾符 而使用protected或private修飾符 使對(duì)數(shù)據(jù)成員的訪問(wèn)必須通過(guò)public的屬性或方法實(shí)現(xiàn) 在類的繼承中 作為基類的數(shù)據(jù)成員通常使用protected修飾符 而不使用private修飾符 因?yàn)槿绻诨愔惺褂胮rivate修飾符聲明數(shù)據(jù)成員 則其成員將不允許派生類成員訪問(wèn) 而protected修飾符 既能保證數(shù)據(jù)成員不被直接訪問(wèn) 又允許其派生類成員訪問(wèn) 3 創(chuàng)建派生類對(duì)象基類與派生類定義完成后 用派生類聲明的對(duì)象 將包含基類的成員 除了構(gòu)造函數(shù) 因此 派生類對(duì)象可以直接訪問(wèn)基類成員 例如 Student 1subS newStudent 1 設(shè)置派生類繼承的基類數(shù)據(jù)成員值subS SetStudent 2005001 張三 女 21 設(shè)置派生類自身數(shù)據(jù)成員值subS SetStudent 1 90 100 subS Show 調(diào)用派生類繼承的基類方法 4 構(gòu)造函數(shù)的調(diào)用在創(chuàng)建派生類對(duì)象時(shí) 調(diào)用構(gòu)造函數(shù)的順序是先調(diào)用基類構(gòu)造函數(shù) 再調(diào)用派生類的構(gòu)造函數(shù) 以完成為數(shù)據(jù)成員分配內(nèi)存空間并進(jìn)行初始化的工作 如果派生類的基類本身是另一個(gè)類的派生類 則構(gòu)造函數(shù)的調(diào)用次序按由高到低順序依次調(diào)用 例如 假設(shè)A類是B類的基類 B類是C類的基類 則創(chuàng)建C類對(duì)象時(shí) 調(diào)用構(gòu)造函數(shù)的順序?yàn)?先調(diào)用A類的構(gòu)造函數(shù) 再調(diào)用B類的構(gòu)造函數(shù) 最后調(diào)用C類的構(gòu)造函數(shù) 密封類C 中有一種類叫密封類 密封類是不允許其他類繼承的類 Convert類就是一個(gè)密封類 定義密封類需要使用sealed關(guān)鍵字 其格式為 訪問(wèn)修飾符sealedclass類名稱 例如 publicsealedclassSealedClass publicstringmethod return 我是密封類 C 還允許將一個(gè)非密封類定義中的某個(gè)方法聲明為密封方法 一旦方法被聲明為密封方法 將不允許在派生類中重載該方法 關(guān)于派生類中重載基類方法 將在下節(jié) 多態(tài)性 中介紹 例如 publicclassSealedMethod publicsealedstringSMethod return 我是一個(gè)密封方法 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訪問(wèn)關(guān)鍵字this和base this關(guān)鍵字引用類的當(dāng)前實(shí)例 靜態(tài)成員方法中不能使用this關(guān)鍵字 this關(guān)鍵字只能在實(shí)例構(gòu)造函數(shù) 實(shí)例方法或?qū)嵗L問(wèn)器中使用base關(guān)鍵字用于從派生類中訪問(wèn)基類的成員 指定創(chuàng)建派生類實(shí)例時(shí)應(yīng)調(diào)用的基類構(gòu)造函數(shù)調(diào)用基類上已被其他方法重寫的方法不能從靜態(tài)方法中使用base關(guān)鍵字 base關(guān)鍵字只能在實(shí)例構(gòu)造函數(shù) 實(shí)例方法或?qū)嵗L問(wèn)器中使用 例8 3 訪問(wèn)關(guān)鍵字this和base示例 p151 向基類構(gòu)造函數(shù)傳遞參數(shù)向基類構(gòu)造函數(shù)傳遞參數(shù) 必須通過(guò)派生類的構(gòu)造函數(shù)實(shí)現(xiàn) 其格式如下 public派生類構(gòu)造函數(shù)名 形參列表 base 向基類構(gòu)造函數(shù)傳遞的實(shí)參列表 base 是C 關(guān)鍵字 表示調(diào)用基類的有參構(gòu)造函數(shù) 傳遞給基類構(gòu)造函數(shù)的 實(shí)參列表 通常包含在派生類構(gòu)造函數(shù)的 形參列表 中 多態(tài)性多態(tài)性概述在類的繼承中 C 允許在基類與派生類中聲明具有同名的方法 而且同名的方法可以有不同的代碼 也就是說(shuō)在基類與派生類的相同功能中可以有不同的具體實(shí)現(xiàn) 從而為解決同一問(wèn)題提供多種途徑 多態(tài)性就是指在程序運(yùn)行時(shí) 執(zhí)行的雖然是一個(gè)調(diào)用方法的語(yǔ)句 卻可以根據(jù)派生類對(duì)象的類型不同完成方法的不同的具體實(shí)現(xiàn) 在C 中可以通過(guò)多種途徑實(shí)現(xiàn)多態(tài)性 例 不同幾何圖形對(duì)象都需要計(jì)算面積的功能 getArea 方法 幾何圖形 長(zhǎng)方形 圓 三角形 問(wèn)題 有若干幾何圖形需要管理 有時(shí)需要統(tǒng)計(jì)這些圖形的數(shù)據(jù) 比如求不同形狀圖形的面積 8 2 3虛方法 重寫方法和隱藏方法 在基類中使用關(guān)鍵字virtual定義虛方法 virtualmethod 然后派生類中使用關(guān)鍵字override來(lái)重寫方法 overridemethod 或使用關(guān)鍵字new來(lái)覆蓋方法 隱藏方法 重寫方法用相同的簽名重寫所繼承的虛方法 虛方法聲明用于引入新方法 而重寫方法或隱藏方法聲明則用于使現(xiàn)有的繼承虛方法專用化 通過(guò)提供該方法的新實(shí)現(xiàn) 調(diào)用虛方法時(shí) 將首先檢查該對(duì)象的運(yùn)行時(shí)類型 并調(diào)用派生類中的該重寫成員 如果沒(méi)有派生類重寫該成員 則調(diào)用其原始成員默認(rèn)情況下 C 方法是非虛擬的 不能重寫非虛方法除了類方法 還可以使用virtual關(guān)鍵字修飾的其他類成員以定義虛成員 包括 屬性 索引器或事件聲明 虛擬成員的實(shí)現(xiàn)可在派生類中使用關(guān)鍵字override來(lái)重寫 或使用關(guān)鍵字new來(lái)覆蓋 例8 4 虛方法 重寫方法和隱藏方法示例 虛方法1 聲明與基類同名的派生類方法在派生類中用new關(guān)鍵字聲明與基類同名的方法的格式如下 publicnew方法名稱 參數(shù)列表 2 聲明虛方法基類中的聲明格式 publicvirtual方法名稱 參數(shù)列表 派生類中的聲明格式 publicoverride方法名稱 參數(shù)列表 virtual方法 當(dāng)方法中包含virtual修飾符時(shí) 方法稱為虛方法 否則 稱為 非虛方法 非虛方法的執(zhí)行功能是確定不變的虛方法的執(zhí)行可以被派生類改變 重新定義此虛方法時(shí) 要求方法名 參數(shù)類型和返回類型完全一致 參數(shù)名可以不同 并加上override修飾符 不能用virtual修飾符 例 管理簡(jiǎn)單的計(jì)算機(jī)圖形信息 包括長(zhǎng)方形 圓形等 可以統(tǒng)計(jì)圖形的面積 classShape charshapeType R C 約定圖形的類型 長(zhǎng)方形 圓形等 doublew 長(zhǎng)方形的寬doubleh 長(zhǎng)方形的高doubleradio 圓形的半徑doublegetArea switch shapeType case A 長(zhǎng)方形returnw h break case B 圓形return3 14 r r break 采用多分支語(yǔ)句分別執(zhí)行不同的代碼需要擴(kuò)充不同的類型的時(shí)候較為麻煩 弊端 1 每一個(gè)對(duì)象占據(jù)同樣大小的內(nèi)存空間 對(duì)于小對(duì)象造成資源的浪費(fèi) 2 增加類型時(shí) 工作量巨大 Shape圖形類 x y 中心點(diǎn)坐標(biāo)virtualgetArea Rect長(zhǎng)方形類length width長(zhǎng)寬overridegetArea Circle圓形類radius半徑overridegetArea 虛函數(shù) 基類中使用virtual修飾 虛函數(shù) 派生類中的使用override修飾 usingSystem classShape 幾何形狀類 publicdoublex 0 y 0 publicvirtualdoublegetArea return0 0 計(jì)算面積 classRect Shape 長(zhǎng)方形類 doublelength width 長(zhǎng)寬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 計(jì)算所有圖形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 計(jì)算所有圖形總面積doubleTotalArea 0 0 for inti 0 i 4 i TotalArea p i getArea Console WriteLine TotalArea 0 TotalArea 子類對(duì)象可以隱式轉(zhuǎn)換為父類對(duì)象 不同類型的對(duì)象可以使用相同的名字調(diào)用 并且調(diào)用正確的版本 usingSystem classShape 幾何形狀publicdoublex 0 y 0 PublicdoublegetArea return0 0 計(jì)算面積 classRect Shape 長(zhǎng)方形doublelength width 長(zhǎng)寬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 計(jì)算所有圖形de面積doubleTotalArea 0 0 for inti 0 i 4 i TotalArea p i getArea Console WriteLine TotalArea 0 TotalArea 父類中不用virtual修飾 子類需要使用new修飾符 虛方法實(shí)例應(yīng)用 趁熱打鐵 我們來(lái)解讀書上153頁(yè)的例8 4練習(xí) 如何通過(guò)虛方法實(shí)現(xiàn)計(jì)算機(jī)圖形的周長(zhǎng)的統(tǒng)計(jì)計(jì)算 長(zhǎng)方形 圓 getgirth 方法 調(diào)用基類方法在派生類中聲明與基類同名的方法 也叫方法重載 在派生類重載基類方法后 如果想調(diào)用基類的同名方法 可以使用base關(guān)鍵字 例如 假定基類與派生類都有一個(gè)無(wú)參數(shù)Show方法 則在派生類中調(diào)用基類Show方法的代碼為 baseShow 調(diào)用基類Show方法 8 3抽象類和抽象方法 將關(guān)鍵字abstract置于關(guān)鍵字class的前面可以將類聲明為抽象類 抽象類不能實(shí)例化 抽象類一般用于提供多個(gè)派生類可共享的基類的公共定義 例如 類庫(kù)可以定義一個(gè)包含基本功能的抽象類 并要求程序員使用該庫(kù)通過(guò)創(chuàng)建派生類來(lái)提供自己的類實(shí)現(xiàn)抽象類與非抽象類相比 具有下列特征 抽象類不能直接實(shí)例化 對(duì)抽象類使用new運(yùn)算符會(huì)導(dǎo)致編譯時(shí)錯(cuò)誤 可以定義抽象類型的變量 但其值必須為null 或者是其派生的非抽象類的實(shí)例的引用允許 但不要求 抽象類包含抽象成員抽象類不能被密封當(dāng)從抽象類派生非抽象類時(shí) 這些非抽象類必須實(shí)現(xiàn)所繼承的所有抽象成員 從而重寫那些抽象成員 例8 5 抽象類示例抽象類中通過(guò)將關(guān)鍵字abstract添加到實(shí)例方法的返回類型的前面可以定義抽象方法 abstractmethod 例8 6 抽象方法示例 抽象類與抽象方法為了實(shí)現(xiàn)多態(tài) 必須在基類中聲明虛方法 但有時(shí)基類中聲明的虛方法無(wú)法實(shí)現(xiàn)具體的功能 這時(shí)需要在基類中聲明抽象方法抽象類是指基類的定義中聲明不包含任何實(shí)現(xiàn)代碼的方法 實(shí)際上就是一個(gè)不具有任何具體功能的方法 這樣的方法唯一的作用就是讓派生類重寫 在基類定義中 只要類體中包含一個(gè)抽象方法 該類即為抽象類 在抽象類中也可以聲明一般的虛方法 1 聲明抽象類與抽象方法聲明抽象類與抽象方法均需使用關(guān)鍵字abstract 其格式為 publicabstractclass類名稱 publicabstract返回類型方法名稱 參數(shù)列表 抽象方法不是一般的空方法 抽象方法聲明時(shí) 沒(méi)有方法體 只有方法頭后跟一個(gè)分號(hào) 2 重載抽象方法當(dāng)定義抽象類的派生類時(shí) 派生類自然從抽象類繼承抽象方法成員 并且必須重寫 重載 抽象類的抽象方法 這是抽象方法與虛方法的不同 因?yàn)閷?duì)于基類的虛方法 其派生類可以不必重寫 重載 重載抽象類方法必須使用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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論