初識繼承和多態(tài)--第五章_第1頁
初識繼承和多態(tài)--第五章_第2頁
初識繼承和多態(tài)--第五章_第3頁
初識繼承和多態(tài)--第五章_第4頁
初識繼承和多態(tài)--第五章_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第五章 初識繼承和多態(tài)初識繼承和多態(tài) 回顧與作業(yè)點評回顧與作業(yè)點評 使用使用new實例化對象時,調(diào)用了什么?實例化對象時,調(diào)用了什么? 說出方法重載的幾個特點?說出方法重載的幾個特點? 預(yù)習(xí)檢查預(yù)習(xí)檢查 子類中調(diào)用父類成員的關(guān)鍵字是什么?子類中調(diào)用父類成員的關(guān)鍵字是什么? 重寫父類方法使用什么關(guān)鍵字?重寫父類方法使用什么關(guān)鍵字? 本章任務(wù)本章任務(wù) 使用繼承和多態(tài)使用繼承和多態(tài) 實現(xiàn)模擬汽車行駛實現(xiàn)模擬汽車行駛 實現(xiàn)員工匯報工作實現(xiàn)員工匯報工作 實現(xiàn)計算器實現(xiàn)計算器 理解繼承的概念理解繼承的概念 能夠利用繼承建立父類和子類能夠利用繼承建立父類和子類 理解多態(tài)的概念理解多態(tài)的概念 會重寫虛方法實現(xiàn)

2、多態(tài)會重寫虛方法實現(xiàn)多態(tài) 本章目標(biāo)本章目標(biāo) 代碼冗余代碼冗余 對比兩個類對比兩個類PM、SE 加入加入CEO類,具有這些相同的屬性類,具有這些相同的屬性 年齡、性別、姓年齡、性別、姓 名等是重復(fù)的名等是重復(fù)的 如何共用重復(fù)代碼?如何共用重復(fù)代碼? 提取冗余代碼提取冗余代碼 將公共的成員放將公共的成員放 到一個類中到一個類中 保留自己特有保留自己特有 的成員的成員 保留自己特有保留自己特有 的成員的成員 提取后的應(yīng)用提取后的應(yīng)用 class SE:Employee public SE(string id, string name, int age, Gender gender,int popul

3、arity) this.ID = id; this.Name = name; this.Age = age; this.Gender = gender; this.Popularity = popularity; / 人氣值人氣值 public int Popularity get; set; . 只有特有的屬性只有特有的屬性 公共屬性仍可訪問公共屬性仍可訪問 繼承繼承 卡車和巴士都是汽車卡車和巴士都是汽車 生活中的繼承生活中的繼承 汽車汽車 剎車剎車 行駛行駛 共有行為:共有行為: 輪子輪子 發(fā)動機發(fā)動機 共有特征:共有特征: 卸貨卸貨 拉貨拉貨 各自行為:各自行為: 載重載重 貨艙貨艙 各

4、自特征:各自特征: 停靠站??空?報站報站 各自行為:各自行為: 載客量載客量 客艙客艙 各自特征:各自特征: 他們共有的特征他們共有的特征 來自汽車來自汽車 有什么共同有什么共同 特征呢?特征呢? 卡車卡車 公共汽車公共汽車 繼承概述繼承概述2-1 繼承:繼承: 在在 C# 中,類可以繼承自另一個類。衍生的類(子類)繼承父中,類可以繼承自另一個類。衍生的類(子類)繼承父 類的方法和數(shù)據(jù)成員類的方法和數(shù)據(jù)成員 子類繼承父類,父類派生子類子類繼承父類,父類派生子類 父類又叫父類又叫基類基類 子類又叫子類又叫派生類派生類 Employee PM SE 子類子類 父類父類 class 子類子類 :

5、父類父類 繼承概述繼承概述2-2 繼承是面向?qū)ο蟮囊粋€重要特性繼承是面向?qū)ο蟮囊粋€重要特性 繼承指出兩個類是繼承指出兩個類是“A 是是 B”關(guān)系關(guān)系 繼承在類圖中繼承在類圖中 的表示的表示 自己特有的自己特有的 成員成員 繼承父繼承父 類的成類的成 員員 繼承需要符合的關(guān)系:繼承需要符合的關(guān)系:is-a SE is a Employee 繼承的實際應(yīng)用繼承的實際應(yīng)用3-1 部門所有人都自我介紹部門所有人都自我介紹SayHi() SE 大家好,我是大家好,我是 XX, 今年今年 XX歲,工號是歲,工號是 XX,我的人氣值高達,我的人氣值高達 XX! PM 大家好,我是大家好,我是 XX ,今年,

6、今年 XX歲,項目管理經(jīng)驗歲,項目管理經(jīng)驗 XX年。年。 子類特有屬性子類特有屬性 子類中訪問繼承父類子類中訪問繼承父類 的公共屬性的公共屬性 繼承的實際應(yīng)用繼承的實際應(yīng)用3-2 SE類和類和PM類都繼承類都繼承Employee父類父類 子類構(gòu)造函數(shù)設(shè)置公共屬性和特有屬性子類構(gòu)造函數(shù)設(shè)置公共屬性和特有屬性 public class PM:Employee public class SE:Employee public SE(string id, string name, int age, Gender gender,int popularity) this.ID = id; this.Name

7、 = name; this.Age = age; this.Gender = gender; this.Popularity = popularity; 繼承自父類的公共屬性繼承自父類的公共屬性 子類擴展的屬性子類擴展的屬性 實現(xiàn)繼承實現(xiàn)繼承 繼承的實際應(yīng)用繼承的實際應(yīng)用3-3 子類特有的子類特有的SayHi()方法方法 實例化對象調(diào)用實例化對象調(diào)用SayHi() public string SayHi() /SE的的SayHi public string SayHi() /PM的的SayHi /實例化一個程序員對象實例化一個程序員對象 SE engineer = new SE(112, 艾邊

8、成艾邊成, 25, Gender.male, 100); Console.WriteLine(engineer.SayHi(); /實例化一個實例化一個PM對象對象 PM pm = new PM(890,蓋茨蓋茨,50,Gender.female,50); Console.WriteLine(pm.SayHi(); SE調(diào)用自己的調(diào)用自己的SayHi() PM調(diào)用自己的調(diào)用自己的SayHi() 演示示例:使用繼承實現(xiàn)問好演示示例:使用繼承實現(xiàn)問好 base調(diào)用父類成員調(diào)用父類成員 關(guān)鍵字關(guān)鍵字base的作用的作用 調(diào)用父類的屬性和方法調(diào)用父類的屬性和方法 public string SayHi

9、() string message = string.Format( 大家好,我是大家好,我是 0, 今年今年 1歲,工號是歲,工號是 2,我的人氣值高達,我的人氣值高達 3!, base.Name, base.Age, base.ID, this.Popularity); return message; 調(diào)用父類的調(diào)用父類的 屬性屬性 protected訪問修飾符訪問修飾符 如何讓父類中的某個成員只允許其子類訪問如何讓父類中的某個成員只允許其子類訪問 protected訪問修飾符只允許繼承它的子類訪問訪問修飾符只允許繼承它的子類訪問 父類成員父類成員 public修飾修飾 子類繼承并可子類繼

10、承并可 以訪問以訪問 private修飾修飾 子類無法訪問子類無法訪問 演示示例:演示示例:protected訪問修飾符訪問修飾符 揭秘子類構(gòu)造函數(shù)揭秘子類構(gòu)造函數(shù) 構(gòu)造子類對象,父類做了什么?構(gòu)造子類對象,父類做了什么? base關(guān)鍵字:顯示調(diào)用父類構(gòu)造函數(shù)關(guān)鍵字:顯示調(diào)用父類構(gòu)造函數(shù) 演示示例:斷點追蹤實例化對象過程演示示例:斷點追蹤實例化對象過程 public SE(string id,string name,int age, Gender gender, int popularity) : base(id, age, name, gender) this.Popularity = po

11、pularity; 顯示調(diào)用父類的顯示調(diào)用父類的 構(gòu)造函數(shù)構(gòu)造函數(shù) 公共屬性在父類構(gòu)造函數(shù)中初始化,公共屬性在父類構(gòu)造函數(shù)中初始化, 代碼簡潔、冗余少代碼簡潔、冗余少 演示示例:使用演示示例:使用base指定調(diào)用父類構(gòu)造函數(shù)指定調(diào)用父類構(gòu)造函數(shù) public SE(string id, string name, int age, Gender gender,int popularity) this.ID = id; . this.Popularity = popularity; base() 隱式調(diào)用父隱式調(diào)用父 類構(gòu)造函數(shù)類構(gòu)造函數(shù) 常見錯誤常見錯誤2-1 class Student:Per

12、son public Student(int age, string name, string hobby) :base(int age, string name) this.Hobby = hobby; 調(diào)用父類構(gòu)造函調(diào)用父類構(gòu)造函 數(shù):傳遞參數(shù)數(shù):傳遞參數(shù) 編譯錯誤編譯錯誤 常見錯誤常見錯誤2-2 class Person public Person(int age, string name) this.Age = age; this.Name = name; public int Age get; set; public string Name get; set; class Stude

13、nt:Person public Student(int age, string name, string hobby) this.Age = age; this.Name = name; this.Hobby = hobby; base() 父類要提供無參的構(gòu)父類要提供無參的構(gòu) 造函數(shù)造函數(shù) 如果父類沒有無參的構(gòu)造函數(shù)如果父類沒有無參的構(gòu)造函數(shù) 子類構(gòu)造函數(shù)必須指明調(diào)用父類哪個構(gòu)造函數(shù)子類構(gòu)造函數(shù)必須指明調(diào)用父類哪個構(gòu)造函數(shù) 指導(dǎo)指導(dǎo)模擬汽車行駛模擬汽車行駛 訓(xùn)練要點訓(xùn)練要點 繼承繼承 base關(guān)鍵字關(guān)鍵字 需求說明需求說明 控制臺程序?qū)崿F(xiàn)汽車與卡車的繼承控制臺程序?qū)崿F(xiàn)汽車與卡車的繼承 汽車

14、類汽車類Vehicle有有VehicleRun ()方法,方法, 輸出輸出“汽車在行駛!汽車在行駛!” 卡車類卡車類Truck有有TruckRun()方法,輸出方法,輸出“型號為型號為XX、產(chǎn)地為、產(chǎn)地為XX的的 卡車在行駛!卡車在行駛!” 實例化一個卡車調(diào)用汽車和卡車的方法實例化一個卡車調(diào)用汽車和卡車的方法 指導(dǎo)指導(dǎo)模擬汽車行駛模擬汽車行駛 實現(xiàn)思路實現(xiàn)思路 創(chuàng)建創(chuàng)建Vehicle,并添加屬性,并添加屬性“類型類型”和和“產(chǎn)地產(chǎn)地”以及構(gòu)造函數(shù)以及構(gòu)造函數(shù) Vehicle類添加方法類添加方法VehicleRun() 創(chuàng)建創(chuàng)建Truck類繼承類繼承Vehicle,添加構(gòu)造函數(shù),添加構(gòu)造函數(shù) T

15、ruck類添加方法類添加方法TruckRun() 編寫測試方法編寫測試方法 完成時間:完成時間:15分鐘分鐘 繼承的傳遞性繼承的傳遞性 汽車汽車 雙層雙層 單層單層 小型卡車小型卡車 重型卡車重型卡車 同樣具有汽車同樣具有汽車 的特征的特征 繼承的傳遞性繼承的傳遞性 卡車卡車公共汽車公共汽車 還可以派生還可以派生 更多的類型更多的類型 繼承的傳遞性繼承的傳遞性 添加一個微型卡車類添加一個微型卡車類 public class SmallTruck : Truck public void SmallTruckRun() Console.WriteLine(微型卡車在行駛!微型卡車在行駛!); st

16、atic void Main(string args) SmallTruck smalltruck = new SmallTruck(); smalltruck.VehicleRun(); smalltruck.TruckRun(); smalltruck.SmallTruckRun(); public class Truck : Vehicle 繼承關(guān)系繼承關(guān)系 父類的父類成員父類的父類成員 父類的成員父類的成員 傳遞性傳遞性 繼承單根性繼承單根性 public class CharmingPerson : SE, Musician 編譯錯誤編譯錯誤 C#中子類不能繼承多個父類中子類不能繼承

17、多個父類 CharmingPerson 軟件工程師軟件工程師 音樂家音樂家 某類人某類人 是否可以這樣是否可以這樣 描述?描述? 具有兩種人的具有兩種人的 特征特征 軟件開發(fā)中繼承的妙處軟件開發(fā)中繼承的妙處 模擬現(xiàn)實世界的關(guān)系模擬現(xiàn)實世界的關(guān)系 便于重用和擴展已徹底測試的代碼,且無需修改便于重用和擴展已徹底測試的代碼,且無需修改 結(jié)構(gòu)更清晰結(jié)構(gòu)更清晰 SE 人氣值人氣值 Employee 姓名姓名 年齡年齡 子類更加關(guān)注與子類子類更加關(guān)注與子類 相關(guān)的行為和狀態(tài)相關(guān)的行為和狀態(tài) 共有屬性由父類負(fù)責(zé)共有屬性由父類負(fù)責(zé) IS-A的應(yīng)用的應(yīng)用 實現(xiàn)多個員工逐個問好(包括實現(xiàn)多個員工逐個問好(包括SE

18、和和PM) 子類子類 is-a 父類,子類可以加入父類類型的父類,子類可以加入父類類型的 泛型集合泛型集合List SE ai = new SE(112, 艾邊成艾邊成, 25, Gender.male, 100); List empls = new List(); empls.Add(ai); if (empls0 is SE) SE se = (SE)empls0; Console.WriteLine(se.SayHi(); 演示示例:演示示例:is a的應(yīng)用的應(yīng)用 is檢查類型檢查類型 指導(dǎo)指導(dǎo)實現(xiàn)工作匯報實現(xiàn)工作匯報 訓(xùn)練要點訓(xùn)練要點 繼承繼承 構(gòu)造函數(shù)構(gòu)造函數(shù) IS-A 需求說明需求

19、說明 PM類和類和SE類均繼承類均繼承Employee,公共屬性在父類構(gòu)造函數(shù)中,公共屬性在父類構(gòu)造函數(shù)中 初始化初始化 實現(xiàn)不同員工匯報工作方法實現(xiàn)不同員工匯報工作方法DoWork() SE通過遍歷工作項,輸出工作信息通過遍歷工作項,輸出工作信息 PM輸出固定工作信息輸出固定工作信息 指導(dǎo)指導(dǎo)實現(xiàn)工作匯報實現(xiàn)工作匯報 難點分析難點分析 Job類定義工作項類定義工作項 SE和和PM繼承員工類繼承員工類 DoWork()方法是子類特有方法是子類特有 的方法的方法 完成時間:完成時間:25分鐘分鐘 擴展的麻煩擴展的麻煩 添加對象后遍歷泛型集合添加對象后遍歷泛型集合 List empls = new

20、 List(); foreach(Employee empl in empls) if (empl is SE) Console.WriteLine(SE)empl).SayHi(); if(empl is PM) Console.WriteLine(PM)empl).SayHi(); 進行判斷對象類進行判斷對象類 型型 調(diào)用相應(yīng)類的調(diào)用相應(yīng)類的 SayHi() 添加多個不同的子類,添加多個不同的子類,SayHi()都不同都不同, ,增加代碼復(fù)雜度如何解決?增加代碼復(fù)雜度如何解決? 巧妙減少判斷冗余巧妙減少判斷冗余 修改修改Employee類類 修改子類修改子類SayHi()方法方法 去除子類

21、類型判斷去除子類類型判斷 public virtual string SayHi() string message = string.Format(大家好!大家好!); return message; 添加添加SayHi()方法方法 用關(guān)鍵字修飾用關(guān)鍵字修飾 foreach(Employee empl in empls) Console.WriteLine(empl.SayHi(); public override string SayHi() 用關(guān)鍵字修飾用關(guān)鍵字修飾 這種方式實現(xiàn)了面向?qū)ο蟮倪@種方式實現(xiàn)了面向?qū)ο蟮亩鄳B(tài)多態(tài) 簡化了代碼維護簡化了代碼維護 生活中的多態(tài)生活中的多態(tài) Cut.!

22、 聽到這個聲音他們聽到這個聲音他們 會做什么?會做什么? 剪斷頭發(fā)剪斷頭發(fā)切開皮膚切開皮膚停止表演停止表演 不同對象對于同一個方法(不同對象對于同一個方法(Cut)實現(xiàn)不同的行為)實現(xiàn)不同的行為 理發(fā)師理發(fā)師 外科醫(yī)生外科醫(yī)生 演員演員 什么是多態(tài)什么是多態(tài) 多態(tài):指兩個或多個屬于不同類的對象,對同一個消息多態(tài):指兩個或多個屬于不同類的對象,對同一個消息 (方法調(diào)用)作出不同響應(yīng)的能力(方法調(diào)用)作出不同響應(yīng)的能力 同一個類在不同場合下表現(xiàn)出不同的行為特征同一個類在不同場合下表現(xiàn)出不同的行為特征 PM對象和對象和SE對象對象SayHi()的內(nèi)容不同的內(nèi)容不同 Employee SE PM Em

23、ployee類,類, 在這兩種場合的在這兩種場合的 行為不同行為不同 重寫虛方法實現(xiàn)多態(tài)重寫虛方法實現(xiàn)多態(tài)2-1 方法重寫方法重寫:子類重寫父類方法:子類重寫父類方法 public class Employee public virtual string SayHi() string message = string.Format(大家好!大家好!); return message; public class SE:Employee public override string SayHi() 重寫重寫 方法名、參數(shù)列表、返回值方法名、參數(shù)列表、返回值 一樣,提供不同的實現(xiàn)一樣,提供不同的實現(xiàn) virtual關(guān)鍵字表關(guān)鍵字表 示虛方法示虛方法 override關(guān)鍵字關(guān)鍵字 實現(xiàn)方法重寫實現(xiàn)方法重寫 1 重寫虛方法實現(xiàn)多態(tài)重寫虛方法實現(xiàn)多態(tài)2-2 方法調(diào)用:方法調(diào)用: 2 Employee ema = new SE(210,Ema,33,Gender.female,100); Console.WriteLine(ema.SayHi(); 定義父類變量,定義父類變量, 創(chuàng)建子類對象創(chuàng)建子類對象 foreach(Employee empl in empls) Console.Write

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論