第6章 抽象類、多態(tài)和接口.ppt_第1頁
第6章 抽象類、多態(tài)和接口.ppt_第2頁
第6章 抽象類、多態(tài)和接口.ppt_第3頁
第6章 抽象類、多態(tài)和接口.ppt_第4頁
第6章 抽象類、多態(tài)和接口.ppt_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第6章 抽象類、多態(tài)和接口,2010-12-17,本章將做進一步的探討。 討論抽象類、多態(tài)以及接口的概念和應用。,2020/7/11,2,C#程序設計實用教程,6.1 抽象類,面向對象編程思想試圖模擬現(xiàn)實中的對象和關系,那么,僅僅使用上一章介紹的類的基本技術就足夠了嗎? 現(xiàn)在,我們來思考一個疑問?,2020/7/11,3,C#程序設計實用教程,6.1.1 什么是抽象類 現(xiàn)實中,存在如圖6-1所示的對象及關系,父類“運動員”有3個子類,這3個子類都可以繼承父類的“訓練”這個方法,但是,仔細考慮下,父類“運動員”的訓練該如何實現(xiàn)呢?,2020/7/11,4,C#程序設計實用教程,6.1.1 什么是

2、抽象類 不同的運動員有不同的訓練方法,無法用統(tǒng)一的訓練方法去針對所有不同的子類運動員??梢姡凇斑\動員”類中,“訓練”只是一個紙上談兵的方法,是一個“虛擬”的方法。 那么,是不是可以把這個方法從運動員中間去掉呢?事實上,“訓練”的存在是有其意義的,它規(guī)定了所有的子類運動員都要有“訓練”這個方法。所以,這個“虛擬”方法也并不是全無用處,可以為其子類設置一個必須包含的方法。 在此,我們把“訓練”這個方法稱為“抽象方法”,把“運動員”這個父類稱為“抽象類”。,2020/7/11,5,C#程序設計實用教程,6.1.1 什么是抽象類 在C#中,抽象方法和抽象類的定義如下: 抽象方法:包含方法定義,但沒有

3、具體實現(xiàn)的方法,需要其子類或者子類的子類來具體實現(xiàn)。 抽象類:含有一個或多個抽象方法的類稱為抽象類。抽象類不能夠被實例化,這是因為它包含了沒有具體實現(xiàn)的方法。,2020/7/11,6,C#程序設計實用教程,6.1.2 聲明抽象類,現(xiàn)在來看抽象方法和抽象類如何在C#中實現(xiàn)。 .在C#中,使用關鍵字abstract來定義抽象方法(abstract method),沒有方法實現(xiàn)的部分,格式如下: public abstract void Train(); .子類繼承抽象父類之后,可以使用override關鍵字覆蓋父類中的抽象方法,并做具體的實現(xiàn),格式如下: public override void

4、Train() 另外,子類也可以不實現(xiàn)抽象方法,繼續(xù)留給其后代實現(xiàn),這時子類仍舊是一個抽象類。,2020/7/11,7,C#程序設計實用教程,6.1.2 聲明抽象類,根據(jù)上面給出的語法,定義運動員抽象類如下: public abstract class Player / 抽象方法:訓練 public abstract void Train(); 代碼定義了運動員抽象類,它有一個抽象方法Train();,2020/7/11,8,C#程序設計實用教程,6.1.3 實現(xiàn)抽象方法,對于子類來說,在繼承了抽象父類之后,就可以具體實現(xiàn)其中的抽象方法了。 【例6-1】下面的代碼分別實現(xiàn)3個子類運動員的抽象方

5、法Train()。 public class FootballPlayer : Player public override void Train() Console.WriteLine(Football players are training.); ,2020/7/11,9,C#程序設計實用教程,6.1.3 實現(xiàn)抽象方法,/ 游泳運動員 public class SwimPlayer : Player public override void Train() Console.WriteLine(Swim players are training.); ,2020/7/11,10,C#程序設

6、計實用教程,6.1.3 實現(xiàn)抽象方法,/ 短跑運動員 public class Sprinters : Player public override void Train() Console.WriteLine(Sprinters are training.); 說明:以上的足球運動員類繼承了運動員類,并實現(xiàn)了其父類中的抽象方法Train()。其余兩個子類與此相同,不再贅述。,2020/7/11,11,C#程序設計實用教程,6.2 多態(tài)性,在上一節(jié)對于抽象類的概念進行介紹,與抽象類緊密相關的一個面向對象機制是多態(tài)。 從字面上可知,多態(tài)即表示多種形態(tài),那什么是類的多種形態(tài)呢?它有什么用處?本節(jié)將

7、對其進行探討。,2020/7/11,12,C#程序設計實用教程,6.2.1 什么是多態(tài),繼續(xù)上一節(jié)給出的例子,現(xiàn)在假設你是一個運動員總教練,手下有足球、游泳、短跑運動員。你把運動員召集起來之后,如果你是只是對他們說“去訓練吧!”,那么他們會怎樣做呢? 很顯然,不同項目的運動員會去做不同的訓練。對于總教練而言,只需要告訴他們的統(tǒng)一的指令即可。在面向對象的思想中,這稱為多態(tài)(Polymorphism)。,2020/7/11,13,C#程序設計實用教程,6.2.1 什么是多態(tài),多態(tài)就是父類定義的抽象方法,在子類對其進行實現(xiàn)之后,C#允許將子類賦值給父類,然后在父類中,通過調(diào)用抽象方法來實現(xiàn)子類具體的

8、功能。 在上一節(jié)的示例中,“運動員”包含一個抽象方法“訓練”,在其子類對“訓練”進行了實現(xiàn)之后,C#允許下面的賦值表達式: Player p=new FootballPlay(); 這樣,就實現(xiàn)把一個子類對象賦值給了父類的一個對象,然后,可以利用父類對象調(diào)用其抽象函數(shù)。 p.Train(); 這樣,該運動員對象就會根據(jù)自己所從事的項目去做相應的訓練。,2020/7/11,14,C#程序設計實用教程,6.2.2 多態(tài)的實現(xiàn),上面介紹了多態(tài)的含義,現(xiàn)在使用上一節(jié)的運動員示例來介紹其具體實現(xiàn)。 其中,對抽象類的實現(xiàn)代碼不變,不再重復。下面說明了如何使用多態(tài)性來對運動員們統(tǒng)一發(fā)號施令。,2020/7/

9、11,15,C#程序設計實用教程,6.2.2 多態(tài)的實現(xiàn),【例6-2】抽象類、抽象方法和多態(tài)的實現(xiàn)。 using System; namespace Example_AbstractClass / 抽象類:運動員 public abstract class Player / 抽象方法:訓練 public abstract void Train(); ,2020/7/11,16,C#程序設計實用教程,6.2.2 多態(tài)的實現(xiàn),/ / 足球運動員 / public class FootballPlayer : Player public override void Train() Console.W

10、riteLine(Football players are training.); ,2020/7/11,17,C#程序設計實用教程,6.2.2 多態(tài)的實現(xiàn),/ / 游泳運動員 / public class SwimPlayer : Player public override void Train() Console.WriteLine(Swim players are training.); ,2020/7/11,18,C#程序設計實用教程,6.2.2 多態(tài)的實現(xiàn),/ / 短跑運動員 / public class Sprinters : Player public override voi

11、d Train() Console.WriteLine(Sprinters are training.); ,2020/7/11,19,C#程序設計實用教程,6.2.2 多態(tài)的實現(xiàn),class MainTest static void Main(string args) Player p; p=new FootballPlayer(); p.Train(); p=new SwimPlayer(); p.Train(); p = new Sprinters(); p.Train(); ,2020/7/11,20,C#程序設計實用教程,6.2.2 多態(tài)的實現(xiàn),說明:代碼聲明了一個運動員對象p,然后

12、對其賦值為足球運動員,并調(diào)用Train()方法讓其訓練;同樣,再使其成為一個游泳運動員,同樣使用Train()方法讓其訓練。只看“p.Train();”這行代碼,對其所調(diào)用的方法是一樣的,但由于p的訓練項目不同,因此,根據(jù)多態(tài)的性質(zhì),p調(diào)用了不同的訓練方法。,2020/7/11,21,C#程序設計實用教程,6.2.3 區(qū)分多態(tài)和重載,如上所述,多態(tài)是基于對抽象方法的覆蓋(override)來實現(xiàn)的,用統(tǒng)一的對外接口來完成不同的功能。在前面,還介紹了重載(overload)的概念,也是使用統(tǒng)一的對外接口來完成不同的功能,那么這兩者有什么區(qū)別呢? 重載,是指允許存在多個同名函數(shù),而這些函數(shù)的參數(shù)不

13、同。重載的實現(xiàn)是:編譯器根據(jù)函數(shù)不同的參數(shù)表,對同名函數(shù)的名稱加以修飾。對于編譯器而言,這些同名函數(shù)就成不同的函數(shù)。它們的調(diào)用地址在編譯期間就綁定了。 多態(tài),是指子類重新定義父類的虛函數(shù)。當子類重新定義了父類的虛函數(shù)后,父類根據(jù)賦給它的不同的子類,動態(tài)調(diào)用屬于子類的該函數(shù),這樣的函數(shù)調(diào)用在編譯期間是無法確定的。 不難看出,兩者的區(qū)別在于編譯器何時去尋找所要調(diào)用的具體方法,對于重載而言,在函數(shù)調(diào)用之前,編譯器就已經(jīng)確定了所要調(diào)用的方法,這稱為“早綁定”或“靜態(tài)綁定”;而對于多態(tài),只有等到函數(shù)調(diào)用的那一刻,編譯器才會確定所要調(diào)用的具體函數(shù),這稱為稱為“晚綁定”或“動態(tài)綁定”。,2020/7/11,

14、22,C#程序設計實用教程,對MainTest類進一步改進,使能能直接的看到動態(tài)綁定。 class MainTest static void Main(string args) Player p = new Player3; p0=new FootballPlayer(); p1=new SwimPlayer(); p2=new Sprinters(); Random rnd = new Random(); int i = rnd.next(0,3); StartTrain(pi); Static void StartTrain(Player tmp) p.train(); ,6.3 接口,前

15、面介紹了抽象類和多態(tài)的概念。 下面介紹與抽象類非常相似的另一個概念:接口。 生活中的接口概念:數(shù)據(jù)線結構,手機充電器 汽車檔位,自行車剎車。,2020/7/11,24,C#程序設計實用教程,6.3.1 什么是接口,接口與抽象類非常相似,它定義了一些未實現(xiàn)的屬性和方法。所有繼承它的類都繼承這些成員,在這個角度上,可以把接口理解為一個類的模板。 接口包含的成員:主要是抽象方法 接口和抽象類的相似之處表現(xiàn)在以下兩方面: 兩者都包含可以由子類繼承的抽象成員; 兩者都不直接實例化。,2020/7/11,25,C#程序設計實用教程,6.3.1 什么是接口,兩者的區(qū)別表現(xiàn)在以下幾個方面: 抽象類除擁有抽象成

16、員之外,還可以擁有非抽象成員;而接口所有的成員都是抽象的。 抽象成員可以是私有的,而接口的成員一般都是公有的。 接口中不能含有構造函數(shù)、析構函數(shù)、靜態(tài)成員和常量。 C#只支持單繼承,即子類只能繼承一個父類,而一個子類卻能夠繼承多個接口。,2020/7/11,26,C#程序設計實用教程,6.3.2 聲明接口,下面通過一個具體的例子,介紹如何在C#中聲明和使用接口。圖6-2所示是一個IShape 接口的示意圖。,示例中有一個“形狀”的概念,它有3個具體的形狀類:矩形、圓形、三角形??梢钥闯?,在某種意義上,接口同完全的抽象類非常相似。,2020/7/11,27,C#程序設計實用教程,6.3.2 聲明

17、接口,C#中聲明接口的語法如下: interface /interface members 接口的成員訪問級別規(guī)定為public,因此,不用在聲明成員時使用訪問級別修飾符。根據(jù)上面給出的語法,下面代碼來聲明這個Ishape接口。 / / 接口:形狀 / public interface Ishape double GetArea(); ,2020/7/11,28,C#程序設計實用教程,6.3.3 實現(xiàn)接口,實現(xiàn): 聲明接口之后,類就可以通過繼承接口來實現(xiàn)其中的抽象方法。繼承接口的語法同類的繼承類似,使用冒號“:”,將待繼承的接口放在類的后面。如果繼承多個接口,將使用逗號將其分隔。,2020/7

18、/11,29,C#程序設計實用教程,6.3.3 實現(xiàn)接口,在下面的代碼中,實現(xiàn)了矩形類,它繼承于Ishape接口,并實現(xiàn)了GetArea()方法。 【例6-3】繼承Ishape接口實現(xiàn)矩形類。 / 矩形類 public class Rectangle: Ishape public double dblWidth;/寬 public double dblHeitht;/高 / 構造函數(shù) public Rectangle(double _dblWidth,double _dblHeight) this.dblWidth=_dblWidth; this.dblHeitht=_dblHeight; ,2020/7/11,30,C#程序設計實用教程,6.3.3 實現(xiàn)接口,/ 求矩形面積 public double GetArea() return this.dbl

溫馨提示

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

評論

0/150

提交評論