C 基礎解析之 多型

2022-04-21 22:47:34 字數 2748 閱讀 5965

今天繼續和大家一起**c#,我們今天來聊聊c#中物件導向中乙個重要的特性------多型

簡單的一句話解釋多型:相同的方法呼叫可以實現不同的實現方式

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

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

函式過載就是乙個多型的表現。(面向過程的程式設計時是沒有函式過載的)

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

編譯時的多型性:編譯時的多型性是通過過載來實現的。系統在編譯時,根據傳遞的引數、返回的型別等資訊決定實現何種操作。

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

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

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

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

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

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

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

1

namespace

abstracts27

8class cardriver : driverman //

子類,汽車駕駛員914

}15class planedriver : driverman //

子類,飛行員

1621

}22 }

然後再在main方法中例項兩個子類物件,呼叫driver方法。

1

static

void main(string

args)

2

執行結果:

建立抽象類的語法:

訪問修飾符 abstract

class 類名

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

訪問修飾符 abstract 返回型別 方法名(引數列表);
子類繼承抽象類後,必須重寫抽象類的抽象方法:

訪問修飾符 override

返回型別 方法名(引數列表)

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

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

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

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

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

1

class policeman //父類2

7}89

class trafficpolice : policeman //

子類10

15 }

在main方法中例項化父類和子類物件並呼叫各自的responsibity方法。

1

static

void main(string

args)

2

執行結果:

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

訪問修飾符 virtual

返回型別 方法名(引數列表)

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

總結:1.什麼是多型,對於多型的解釋。

2.抽象類

3.虛方法

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

C 基礎之多型

多型分為靜態多型和動態多型。靜態多型分為函式過載和泛型程式設計。動態多型是通過虛函式來實現的。靜態多型 叫靜態繫結或早繫結 編譯器在編譯期間完成的,編譯器可以根據函式實參的型別 可能會進行隱式的型別轉換 注意 巨集不是靜態多型,巨集是在預處理階段完成的動態多型 又叫動態繫結或者晚繫結 在程式執行期間...

c 基礎之 多型

c 物件導向的三大特徵 虛函式 是在基類中使用關鍵字 virtual 宣告的函式。在派生類中重新定義基類中定義的虛函式時,會告訴編譯器不要靜態鏈結到該函式。我們想要的是在程式中任意點可以根據所呼叫的物件型別來選擇呼叫的函式,這種操作被稱為動態鏈結,或後期繫結。多型是由虛函式實現的,而虛函式主要是通過...

c 基礎學習之多型

最近在看一本書 你必須知道的.net 書涵蓋的內容比較多,對於c net平台以往所學的零散東西有了慢慢的總結和新的認識。把一些程式設計客棧基礎的東西記錄於此。先說說多型吧 1.基類繼承式多型 如書中所說,基類繼承式多型的關鍵是繼承體系的設計與實現。書中舉了個簡單的列子 複製 如下 files myf...