C#基礎解析之 Ⅶ【多態】


今天繼續和大家一起探討C#,我們今天來聊聊C#中面向對象中一個重要的特性------多態

簡單的一句話解釋多態:相同的方法調用可以實現不同的實現方式

通俗的說多態就是不同的表現形式,比如:中國人吃飯用筷子,歐洲以及北美都用刀叉,還有一些另類的人種直接上手,雖然他們的行為方式不同,但是他們有一個目的就是吃飯!

說白了多態就是同一個操作(通常是指方法,也可以是屬性,事件甚至是字段),根據不同的對象能實現不同的效果。

函數重載就是一個多態的表現。(面向過程的編程時是沒有函數重載的)

多態性又分為兩種,一種是編譯時的多態性,一種是運行時的多態性。

編譯時的多態性:編譯時的多態性是通過重載來實現的。系統在編譯時,根據傳遞的參數、返回的類型等信息決定實現何種操作。

運行時的多態性:運行時的多態性是通過重寫虛成員實現。系統運行時,才根據實際情況決定實現何種操作。

多態中有兩個方法一個是重載一個是重寫(這個兩個方法在上一章繼承中已經詳細的提到了,在本章多態中就不做過多解釋了),重載是方法名必須相同參數列表必須不相同返回值類型可以不相同;重寫是相同的方法名稱相同的參數列表相同的返回值類型。

我們首先來看一下抽象類,抽象類中有個關鍵字---abstract,凡是用abstract關鍵字修飾的類都是抽象類。例如:abstract class Animal{}

對於抽象類可能有些初學者不太明白為什么要使用抽象類,為什么不直接把父類中的方法實現,或者子類中實現一個和父類無關的新方法。對於抽象類我想用現實生活中的例子來說明一下。例如:兩個人對話 “小陳,幫我把那個東西拿過來” 小陳:“你說的是把水杯拿過去嗎?”

你要的是水杯類的對象,而東西是水杯的父類,通常東西類沒有實例對象,但是我們有時需要東西的引用指向它的子類實例。在這個生活中的例子中,“東西”就是抽象類,水杯是它的子類,它不具體指某一類對象,卻可以只帶所有類型的對象,雖然它抽象,但是它很簡單方便。

在我們編程過成中為了簡單方便於是就用到了抽象類。

下面我們來一起使用一下抽象類

 1 namespace abstracts
 2 {
 3     abstract class DriverMan    //抽象類,父類
 4     {
 5         public abstract void Driver();  //抽象方法
 6     }
 7 
 8     class CarDriver : DriverMan //子類,汽車駕駛員
 9     {
10         public override void Driver()   //重寫抽象方法
11         {
12             Console.WriteLine("司機:布加迪威龍已經停在公司門口了");
13         }
14     }
15     class PlaneDriver : DriverMan //子類,飛行員
16     {
17         public override void Driver()
18         {
19             Console.WriteLine("飛行員:亞特蘭蒂斯號准備升空");
20         }
21     }
22 }

然后再在Main方法中實例兩個子類對象,調用Driver方法。

 1         static void Main(string[] args)
 2         {
 3             Console.WriteLine("李曉峰准備去參加WCG世界總決賽,請把汽車准備好");
 4             DriverMan dm = new CarDriver();//用父類實例化司機對象
 5             dm.Driver();//調用駕駛方法
 6             Console.WriteLine("通知機場,李曉峰的飛機馬上要起飛了");
 7             DriverMan dm1 = new PlaneDriver();//用父類實例化飛行員對象
 8             dm1.Driver();//調用駕駛方法
 9             Console.ReadKey();
10         }

運行結果:

創建抽象類的語法:

訪問修飾符 abstract class 類名

在抽象類中定義抽象類方法的語法:

訪問修飾符 abstract 返回類型 方法名(參數列表);

子類繼承抽象類后,必須重寫抽象類的抽象方法:

訪問修飾符 override 返回類型 方法名(參數列表)
{
  方法體
}

需要注意一下的是,在子類重寫父類的抽象方法時,訪問修飾符、返回類型、方法名和參數列表必須和父類的抽象方法一致。

 

接下來我們來簡單的了解一下虛方法。

首先我們為什么要用虛方法呢?在上面的抽象類中我們了解到我們都是采用的父類的抽象方法在子類中重寫,因為抽象方法時沒有方法體的,所以當遇到某些需要父類的方法有方法體時我們就用到了虛方法。

比如說:警察是保護公民的生命及財產安全的,具有擒拿格斗的功夫,而交警就不會這些,他們只會指揮交通,所以交警繼承警察的同時必須重寫父類的行為方法,而父類警察也要實現自己的行為方法。在這種情況下我們就需要學習虛方法了。

我們來用個控制台明確一下我們的思路:

 1   class Policeman    //父類
 2     {
 3         public virtual void Responsibility()  //虛方法,有方法體
 4         {
 5             Console.WriteLine("警察,職責是保衛人民的生命財產安全");
 6         }
 7     }
 8 
 9     class TrafficPolice : Policeman //子類
10     {
11         public override void Responsibility()   //重寫父類的虛方法
12         {
13             Console.WriteLine("交警,職責是指揮交通");
14         }
15     }

在Main方法中實例化父類和子類對象並調用各自的Responsibity方法。

1 static void Main(string[] args)
2         {
3             Policeman man = new Policeman();  //實例化父類對象
4             man.Responsibility();   //調用父類的方法
5             TrafficPolice tman = new TrafficPolice();   //實例化子類對象
6             tman.Responsibility();  //調用子類的方法
7             Console.ReadKey();
8         }

運行結果:

父類中定義虛方法的語法:

訪問修飾符 virtual 返回類型 方法名(參數列表)
{
  方法體
}

在這里說明一下:虛方法相比抽象方法,它更像一個普通方法,加關鍵字virtual的目的就是為了方便子類重寫。因為普通方法用override在子類中重寫會報錯,在C#里面是不可以滴。還有就是具有虛方法的類不一定是抽象類,但是具有抽象方法的類一定是抽象類。需要注意的是虛方法在子類中可以不重寫。如果虛方法沒有被子類重寫,再類對象調用的就是父類的虛方法。而抽象方法就必須在子類中重寫。

總結:1.什么是多態,對於多態的解釋。

   2.抽象類

     3.虛方法

 OK !今天就和大家討論到這吧!  今天的內容不多!不過還是本着一個原則,那就是細膩、容易理解。我個人感覺這些內容對新手的幫助還是很大的。還是那句話只要我所寫的東西對大家有用或者有一點點幫助,那么我的分享就有價值。。。

此文是本人的個人觀點,如有不完善或者不准確的地方,歡迎高手進行批評,老鳥進行指點。

作者:青蘋果
座右銘:不斷的反省自己!然后加以改變!
感興趣的技術:.NET、數據庫、JavaScript、C#、ajax、winform、jquery、extjs
本文出處:http://www.cnblogs.com/xinchun/

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM