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