C 多型,虛方法,抽象方法

2022-05-08 08:39:26 字數 2642 閱讀 2610

多型

是物件導向程式設計中三大機制之一,其原理建立在"從父類繼承而來的子類可以轉換為其父類"這個規則之上,換句話說,能用父類的地方,就能用該類的子類.當從父類派生了很多子類時,由於每個子類都有其不同的**實現,所以當用父類來引用這些子類時,同樣的操作而可以表現出不同的操作結果,這就是所謂的多型. 

1.了解什麼是多型性

2.如何定義乙個虛方法

3.如何過載乙個虛方法

4.如何在程式中運用多型性

物件導向程式設計中的另外乙個重要概念是多型性。在執行時,可以通過指向基類的指標,來呼叫實現派生類中的方法。 可以把一組物件放到乙個陣列中,然後呼叫它們的方法,在這種場合下,多型性作用就體現出來了,這些物件不必是相同型別的物件。當然,如果它們都繼承自某個類,你可以把這些派生類,都放到乙個陣列中。 如果這些物件都有同名方法,就可以呼叫每個物件的同名方法。本節課將向你介紹如何完成這些事情。

1.清單9-1. 帶有虛方法的基類:drawingobject.cs

using system; 

public class drawingobject  }

說明清單9-1 定義了drawingobject類。這是個可以讓其他物件繼承的基類。該類有乙個名為draw()的方法。draw()方法帶有乙個virtual修飾符,該修飾符表明:該基類的派生類可以過載該方法。drawingobject類的 draw()方法完成如下事情:輸出語句"i'm

just a generic drawing object."到控制台。

2.清單9-2. 帶有過載方法的派生類:line.cs,

circle.cs, and square.cs

using

system; 

public class line : drawingobject  }

public

class circle : drawingobject  }

public

class square : drawingobject  }

說明清單9-2定義了三個類。這三個類都派生自drawingobject類。每個類都有乙個同名draw()方法,這些draw()方法中的每乙個都有乙個過載修飾符。過載修飾符可讓該方法在執行時過載其基類的虛方法,實現這個功能的條件是:通過基類型別的指標變數來引用該類。

3.清單9-3. 實現多型性的程式:drawdemo.cs

using

system; 

public class drawdemo 

return 0; } }

說明清單9-3演示了多型性的實現,該程式使用了在清單 9-1 和清單9-2中定義的類。在drawdemo類中的main()方法中,建立了乙個陣列, 陣列元素是drawingobject 類的物件。該陣列名為dobj,是由四個drawingobject型別的物件組成。

接下來, 初始化dobj陣列, 由於line, circle和square類都是drawingobject類的派生類,所以這些類可以作為dobj陣列元素的型別。 如果c#沒有這種功能,你得為每個類建立乙個陣列。繼承的性質可以讓派生物件當作基類成員一樣用,這樣就節省了程式設計工作量。

一旦陣列初始化之後,接著是執行foreach迴圈,尋找陣列中的每個元素。在每次迴圈中, dobj 陣列的每個元素(物件)呼叫其draw()方法。多型性體現在:在執行時,各自呼叫每個物件的draw()方法。儘管dobj 陣列中的引用物件型別是drawingobject,這並不影響派生類過載drawingobject

類的虛方法draw()。 在dobj 陣列中,通過指向drawingobject 基類的指標來呼叫派生類中的過載的draw()方法。

輸出結果是:

i'm a

line. 

i'm a circle. 

i'm a square. 

i'm just a generic drawing object.

在drawdemo

程式中,呼叫了每個派生類的過載的draw()方法。 最後一行中,執行的是drawingobject類的虛方法draw()。這是因為執行到最後,陣列的第四個元素是drawingobject類的物件。

小結 現在對多型性有所了解之後,你可以在派生類中,實現乙個過載基類虛方法的方法。虛方法和過載的派生類方法之間的關係就體現出c#的多型性。 

注:**於 

虛方法:

1、virtual方法表示此方法可以被重寫, 也就是說這個方法具有多型.父類中的方法是通用方法,可以在子類中重寫以重新規定方法邏輯. 

2、virtual方法可以直接使用,和普通方法一樣 

3、不是必須重寫的. 子類可以使用base.方法

的方式呼叫, 無論有沒有在子類使用override去重寫

virtual關鍵字只是明確標示此方法可以被重寫, 其實它和一般的方法沒有什麼區別 

相應的 

sealed關鍵字標示此方法不可以被重寫

虛方法和抽象方法的區別:

1.虛方法可以有實現體,抽象方法不能有實現體。

2.抽象方法

要求派生類必須過載這個方法;

虛方法告訴編譯器,這個方法可以重寫。

當基類的方法與派生類的方法重名時,

可以選擇派生類的方法從基類繼承並重寫,

還是,把基類的方法隱藏起來。 

C 虛方法 抽象方法

首先在c 中虛方法的定義 public virtual void virtualmethod 只要在方法名前加上virtual,就宣告了該方法為虛方法,注意宣告為虛方法後再不能加上abstract,static關鍵字宣告 以下是插入乙個例項來說明虛方法與非虛方法的不同 public class a ...

C 虛方法和抽象方法

虛方法 1 virtual方法表示此方法可以被重寫,也就是說這個方法具有多型.父類中的方法是通用方法,可以在子類中重寫以重新規定方法邏輯.2 virtual方法可以直接使用,和普通方法一樣 3 不是必須重寫的.子類可以使用base.方法 的方式呼叫,無論有沒有在子類使用override去重寫 vir...

C 虛方法和抽象方法

虛方法 1 virtual方法表示此方法可以被重寫,也就是說這個方法具有多型.父類中的方法是通用方法,可以在子類中重寫以重新規定方法邏輯.2 virtual方法可以直接使用,和普通方法一樣 3 不是必須重寫的.子類可以使用base.方法 的方式呼叫,無論有沒有在子類使用override去重寫 vir...