C#程序設(shè)計(jì)項(xiàng)目化教程課件ch08_第1頁
C#程序設(shè)計(jì)項(xiàng)目化教程課件ch08_第2頁
C#程序設(shè)計(jì)項(xiàng)目化教程課件ch08_第3頁
C#程序設(shè)計(jì)項(xiàng)目化教程課件ch08_第4頁
C#程序設(shè)計(jì)項(xiàng)目化教程課件ch08_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

單元8使用繼承和多態(tài)開發(fā)程序本章

要點(diǎn)類繼承的相關(guān)知識(shí)多態(tài)的相關(guān)知識(shí)

技能目標(biāo)能利用繼承建立基類和派生類能用虛方法實(shí)現(xiàn)多態(tài)能用抽象方法實(shí)現(xiàn)多態(tài)

單元8使用繼承和多態(tài)開發(fā)程序8.2技術(shù)與知識(shí)準(zhǔn)備8.2.1繼承

單元8使用繼承和多態(tài)開發(fā)程序

繼承的概念繼承是面向?qū)ο缶幊痰囊粋€(gè)最重要的特征,使用繼承可以避免大量的重復(fù)工作。當(dāng)多個(gè)不同的類具有大量相同的特征時(shí),而且這些類之間的關(guān)系非常清晰,這時(shí)使用繼承,能更方便快捷地開發(fā)出優(yōu)秀的軟件。C#繼承應(yīng)遵循下列規(guī)則。(1)繼承是可傳遞的,如果C從B派生,B又從A派生,那么C不僅繼承了B中聲明的成員,同樣也繼承了A的成員。Object類是所有類的基類。(2)繼承具有單根性,一個(gè)派生類不能同時(shí)繼承多個(gè)基類。(3)派生類應(yīng)當(dāng)是對(duì)基類的擴(kuò)展,在派生類中可以添加新的成員,但不能去除已經(jīng)繼承的成員的定義。(4)構(gòu)造函數(shù)和析構(gòu)函數(shù)不能被繼承。單元8使用繼承和多態(tài)開發(fā)程序繼承的使用

基類是對(duì)派生類的抽象,派生類是對(duì)基類的具體化,是基類定義的延續(xù)。繼承的主要優(yōu)點(diǎn)就是代碼重用,只要在基類中編寫一次代碼,其所有派生類都會(huì)自動(dòng)繼承這些代碼。類實(shí)現(xiàn)繼承的一般語法形式如下:<訪問修飾符>class<派生類名>:<基類名>{//<類成員>}單元8使用繼承和多態(tài)開發(fā)程序

子類構(gòu)造函數(shù)1.隱式調(diào)用父類構(gòu)造函數(shù)子類繼承父類,那么子類對(duì)象在創(chuàng)建的過程中,父類起了什么作用呢?

publicVehicle(){Console.WriteLine("父類無參對(duì)象構(gòu)造執(zhí)行!");}publicVehicle(stringtype,stringplace){this.Type=type;this.Place=place;}//卡車類構(gòu)造函數(shù)publicTruck(stringtype,stringplace,doubleload){this.Type=type;this.Place=place;this.Load=load;}//Main方法staticvoidMain(string[]args){Trucktruck=newTruck("奧迪A6","德國",5);truck.VehicleRun();truck.TruckRun();

Console.ReadLine();}單元8使用繼承和多態(tài)開發(fā)程序2.顯式調(diào)用父類構(gòu)造函數(shù)C#可以用base關(guān)鍵字調(diào)用父類的構(gòu)造函數(shù),實(shí)現(xiàn)繼承屬性的初始化,然后在子類本身的構(gòu)造函數(shù)中完成對(duì)子類特有屬性的初始化。顯式調(diào)用父類構(gòu)造函數(shù),程序代碼如下//Vehicle類的構(gòu)造函數(shù)publicVehicle(stringtype,stringplace){this.Type=type;this.Place=place;}//Truck類的構(gòu)造函數(shù)publicTruck(stringtype,stringplace,doubleload):base(type,place){this.Load=load;}單元8使用繼承和多態(tài)開發(fā)程序IS-A的應(yīng)用在前面我們說卡車?yán)^承汽車,其實(shí)公共汽車、轎車都繼承于汽車。如果要在MyCar案例中添加一個(gè)公共汽車類Bus,同樣繼承于汽車類,要實(shí)現(xiàn)對(duì)所有汽車的屬性輸出功能,并要求所有對(duì)象都存儲(chǔ)在泛型集合List<T>中,該如何實(shí)現(xiàn)呢?我們知道,List<T>會(huì)對(duì)類型進(jìn)行約束,Truck和Bus屬于不同類型,那么怎樣把它們加入到同一個(gè)集合中呢?由于Truck和Bus都繼承Vehicle,即TruckisaVehicle,BusisaVehicle,所以可以定義一個(gè)List<Vehicle>的集合,Truck和Bus都可以加入到這個(gè)集合中。當(dāng)要遍歷集合進(jìn)行屬性輸出時(shí),只需要對(duì)每個(gè)對(duì)象的類型進(jìn)行判斷。

單元8使用繼承和多態(tài)開發(fā)程序多態(tài)是在繼承的基礎(chǔ)上擴(kuò)展類的功能,是指兩個(gè)或多個(gè)屬于不同類的對(duì)象,對(duì)于同一個(gè)消息(方法調(diào)用)作出不同響應(yīng)的方式。其實(shí)生活中有許多多態(tài)的例子。比如:如果我們要求三種人——外科大夫、理發(fā)師和演員進(jìn)行“cut”動(dòng)作,會(huì)發(fā)生什么情況呢?理發(fā)師會(huì)開始剪頭發(fā)(cut=剪)。外科大夫會(huì)在病人身體上割開一個(gè)切口(cut=切開)。演員會(huì)停止表演,等待導(dǎo)演下一步指令(cut=停止拍攝)??梢园讶N不同職業(yè)的人看作三個(gè)不同的子類對(duì)象(繼承自人類)。每個(gè)對(duì)象得到同一個(gè)消息——“cut”,但他們知道對(duì)于自己來說,這個(gè)命令意味著不同的含義,因?yàn)樗麄兌记宄约旱穆殬I(yè)。

8.2.2多態(tài)多態(tài)的概念

單元8使用繼承和多態(tài)開發(fā)程序虛方法實(shí)現(xiàn)多態(tài)如果希望基類中某個(gè)方法能夠在派生類中進(jìn)一步得到改進(jìn),那么可以將這個(gè)方法定義為虛方法,虛方法就是可以在派生類中對(duì)其實(shí)現(xiàn)進(jìn)一步改進(jìn)的方法。虛方法實(shí)現(xiàn)多態(tài)的基本步驟如下:基類中定義方法,用virtual關(guān)鍵字定義為虛方法。派生類中定義派生類自己的方法(重寫虛方法),用override關(guān)鍵字修飾。派生類重寫基類的虛方法,其中有兩種方式。創(chuàng)建基類變量,用派生類對(duì)象實(shí)例化這個(gè)基類變量。把基類類型作為參數(shù)類型,它的派生類對(duì)象作為參數(shù)傳入。運(yùn)行時(shí),根據(jù)實(shí)際創(chuàng)建的對(duì)象決定執(zhí)行哪個(gè)方法。注意:virtual關(guān)鍵字必須位于方法的返回類型之前,而且虛方法可以有方法體,這和稍后講到的抽象方法很不同,抽象方法是必須被派生類重寫的方法,其本身不允許有方法體。當(dāng)重寫基類虛方法時(shí),重寫方法必須與被重寫的虛方法具有相同的方法簽名。另外,請(qǐng)注意虛函數(shù)的限制:靜態(tài)成員函數(shù)不能是虛函數(shù)。構(gòu)造函數(shù)不能是虛函數(shù)}單元8使用繼承和多態(tài)開發(fā)程序1.抽象類及抽象方法在上面示例定義了Person類,不難看出,該類代表人類。如果把它實(shí)例化,調(diào)用其中的Speak()方法,實(shí)際意義不大。因?yàn)槿祟惐旧硎且粋€(gè)宏觀的、抽象的概念,沒有具體化。假如不希望這個(gè)基類被實(shí)例化,并且只提供方法的定義,自己不去實(shí)現(xiàn),而讓子類實(shí)現(xiàn)這些方法,該如何做呢?C#中用抽象類和抽象方法來解決這個(gè)問題。抽象類及抽象方法僅可以被繼承,不能被實(shí)例化。抽象方法不能包含方法體,并且抽象方法所在的類必須也聲明為抽象類。要聲明抽象類及抽象方法,可以使用關(guān)鍵字abstract,關(guān)鍵字abstract置于關(guān)鍵字class的前面。示例:抽象類及抽象方法。abstractclassPerson{publicabstractvoidSpeak();}抽象方法實(shí)現(xiàn)多態(tài)

單元8使用繼承和多態(tài)開發(fā)程序2.抽象類及抽象方法的應(yīng)用當(dāng)從一個(gè)抽象基類派生一個(gè)子類時(shí),子類將繼承基類的所以特征,包括它未實(shí)現(xiàn)的抽象方法。抽象方法必須在其子類中實(shí)現(xiàn),除非它的子類也是抽象類。與子類重寫虛方法一樣,在子類中實(shí)現(xiàn)一個(gè)抽象方法的方式也是使用override關(guān)鍵字來重寫抽象方法。示例:抽象方法實(shí)現(xiàn)多態(tài)。//Person類abstractclassPerson{publicabstractvoidSpeak();}//Chinese類classChinese:Person{publicoverridevoidSpeak(){Console.WriteLine("說中文...");}}單元8使用繼承和多態(tài)開發(fā)程序8.2.3面向?qū)ο蟮娜筇匦缘酱藶橹?,面向?qū)ο缶幊讨腥齻€(gè)非常重要的特性:封裝、繼承和多態(tài),我們已經(jīng)全部學(xué)習(xí)完了,總結(jié)如下。封裝:保證對(duì)象自身數(shù)據(jù)的完整性和安全性。繼承:建立類之間的關(guān)系,實(shí)現(xiàn)代碼復(fù)用,方便系統(tǒng)的擴(kuò)展。多態(tài):相同的方法調(diào)用可實(shí)現(xiàn)不同的實(shí)現(xiàn)方式。單元8使用繼承和多態(tài)開發(fā)程序通過8.2內(nèi)容的學(xué)習(xí),應(yīng)該理解了繼承和多態(tài)的概念,能實(shí)現(xiàn)類間的繼承,并熟練利用虛方法和抽象方法實(shí)現(xiàn)多態(tài)。下面我們將回到8.1節(jié)中介紹的工作場(chǎng)景中,完成工作任務(wù)。8.3回到工作場(chǎng)景【步驟1】【工作過程一】【步驟1】新建一個(gè)名為“SuperMarket”的Windows應(yīng)用程序?!静襟E2】添加一個(gè)抽象商品類(Goods),該類具有商品條形碼(id)、商品名稱(name)、商品價(jià)格(price)和商品數(shù)量(number)字段,屬性Id、Name、Price、Number以及用于完成對(duì)象初始化工作的自定義構(gòu)造函數(shù)和用于計(jì)算商品價(jià)格的抽象方法【步驟3】創(chuàng)建穿著類(Clothing)、車輛類(Vehicle)和電子類(Electric)均繼承Goods,添加構(gòu)造函數(shù)和實(shí)現(xiàn)Goods類定義的抽象方法Compute()。//穿著類ClothingclassClothing:Goods{publicClothing(stringid,stringname,doubleprice,intnumber):base(id,name,price,number){}publicoverridevoidCompute(){this.Price=this.Price-(int)(this.Price/200)*100;}}單元8使用繼承和多態(tài)開發(fā)程序//車輛類VehicleclassVehicle:Goods{publicVehicle(stringid,stringname,doubleprice,intnumber):base(id,name,price,number){}publicoverridevoidCompute(){this.Price=this.Price-(int)(this.Price/500)*50;}}//電子類ElectricclassElectric:Goods{publicElectric(stringid,stringname,doubleprice,intnumber):base(id,name,price,number){}publicoverridevoidCompute(){this.Price=this.Price-(int)(this.Price/2000)*100;}}【工作過程二】【步驟1】設(shè)計(jì)程序界面單元8使用繼承和多態(tài)開發(fā)程序【步驟2】初始化購買商品集合信息。Dictionary<string,Goods>StockGoods;【步驟3】窗體加載時(shí),顯示顧客購買商品信息。關(guān)鍵代碼如下。//泛型集合StockGoods綁定ListView控件privatevoidFillList(Dictionary<string,Goods>stockGoods,ListViewlistview){lvGoods.Items.Clear();if(StockGoods.Count==0){MessageBox.Show("沒有數(shù)據(jù)","注意",MessageBoxButtons.OK,MessageBoxIcon.Information);}else{foreach(GoodsgoodsinStockGoods.Values){stringid=goods.Id;stringname=goods.Name;stringprice=goods.Price.ToString();stringnumber=goods.Number.ToString();string[]subItem={id,name,price,number};ListViewItemitem=newListViewItem(subItem);listview.Items.Add(item);}}單元8使用繼承和多態(tài)開發(fā)程序【工作過程三】選中一個(gè)商品,單擊右鍵菜單,計(jì)算購買該商品折扣后的價(jià)格。關(guān)鍵代碼如下://定義泛型集合keys,保存已計(jì)算過的商品條形碼

List<string>keys=newList<string>();//“計(jì)算價(jià)格”右鍵菜單的單擊事件privatevoid計(jì)算價(jià)格ToolStripMenuItem_Click(objectsender,EventArgse){if(this.lvGoods.SelectedItems.Count==0){MessageBox.Show("沒有選擇。");return;}stringkey=this.lvGoods.SelectedItems[0].Text;if(!keys.Contains(key)){keys.Add(key);StockGoods[key].Compute();}MessageBox.Show(string.Format("購買{0}的總價(jià)為a{1}",StockGoods[key].Name,StockGoods[key].Price*StockGoods[key].Number));}單元8使用繼承和多態(tài)開發(fā)程序8.4工作訓(xùn)練營8.4.1項(xiàng)目訓(xùn)練1、訓(xùn)練內(nèi)容在Office案例中添加程序員類(SE)和項(xiàng)目經(jīng)理類(PM),繼承員工類(Employee)。添加Job類定義工作項(xiàng)。在Employee類中添加匯報(bào)工作方法并在SE和PM類中具體實(shí)現(xiàn)。利用多態(tài)方法,實(shí)現(xiàn)不同員工匯報(bào)工作。

2、訓(xùn)練目的理解繼承和多態(tài)的概念,能正確使用繼承減少代碼冗余,利用virtual和override實(shí)現(xiàn)多態(tài),進(jìn)行員工工作匯報(bào)。單元8使用繼承和多態(tài)開發(fā)程序3、訓(xùn)練過程【步驟1】在“Office”案例中添加SE類和PM類,繼承自Employee類,同時(shí)添加Job類定義工作項(xiàng)。在Employee類中添加匯報(bào)工作方法并在SE和PM類中具體實(shí)現(xiàn)?!静襟E2】在主窗體中定義員工集合,初始化員工信息。關(guān)鍵代碼如下。publicpartialclassForm1:Form{List<Employee>empls=newList<Employee>();publicForm1(){InitializeComponent();Init();}//員工信息初始化

publicvoidInit(){//實(shí)例化程序員對(duì)象

List<Job>list1=newList<Job>();list1.Add(newJob("編碼","購物車模塊"));list1.Add(newJob("測(cè)試","給購物車模塊做單元測(cè)試"));SEai=newSE("112","艾邊成",25,Gender.男,list1);List<Job>list2=newList<Job>();list2.Add(newJob("設(shè)計(jì)","數(shù)據(jù)庫建模"));list2.Add(newJob("編寫文檔","詳細(xì)設(shè)計(jì)說明書"));

SEjoe=newSE("113","Joe",30,Gender.女?,list2);

//實(shí)例化PM對(duì)象

PMpm=newPM("890","蓋茨",50,Gender.男,null);empls.Add(ai);empls.Add(joe);empls.Add(pm);}單元8使用繼承和多態(tài)開發(fā)程序【步驟3】處理按鈕單擊事件,實(shí)現(xiàn)不同員工匯報(bào)工作。關(guān)鍵代碼如下。privatevoidReport_Click(objectsender,EventArgse){foreach(Employeeempinempls){MessageBox.Show(emp.DoWork(),"匯報(bào)");}}4、技術(shù)要點(diǎn)類的繼承、虛方法的定義和重寫、多態(tài)的實(shí)現(xiàn)。單元8使用繼承和多態(tài)開發(fā)程序8.4.2工作實(shí)踐常見問題解析【問題1】講解繼

溫馨提示

  • 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)論