一:virtual實現多型
shape類是通用的基類,draw是乙個虛方法,每個派生類都可以有自己的override版本,在執行時可以用shape類的變數動態的呼叫draw方法。
public
class
shape
} public
class
rectangle :shape
} public
class
square :rectangle
} class
program
console.readkey();
/*執行結果
drawing a rectangle
drawing a square
drawing a rectangle
*/ } }
方法、屬性、事件、索引器都可以被virtual修飾,但是欄位不可以。派生類必須用override表示類成員參與虛呼叫。假如把square中的draw方法替換為用new 修飾,則表示draw方法不參與虛呼叫,而且是乙個新的方法,只是名字和基類方法重名。
public
newvoid draw()
這個方法在main方法中的foreach中將不會被呼叫,它不是虛方法了。用new修飾符後的程式執行結果,
/*執行結果
drawing a rectangle
drawing a rectangle
*/ 假如說虛方法在rectangle擴充套件後,不希望square擴充套件了,可以在方法前加上sealed修飾符,
如下 public
class
rectangle :shape }
當派生類重寫某個虛擬成員時,即使該派生類的例項被當作基類的例項訪問或者把派生類例項賦給父類變數進行訪問,但是還是會呼叫派生類重寫後的成員,可以把**改為如下形式,
static
void main(string args)
console.readkey();
/*執行結果
drawing a rectangle
drawing a square
drawing a rectangle
*/ }
二:abstract實現多型
public
abstract
class
shape
public
class
rectangle :shape
} public
class
square :rectangle
} class
program
console.readkey(); } }
inte***ce實現多型
介面可由方法、屬性、事件、索引器或這四種成員型別的任何組合構成。介面不能包含字段。介面成員預設是公共的,抽象的,虛擬的。若要實現介面成員,類中的對應成員必須是公共的、非靜態的,並且與介面成員具有相同的名稱和簽名。下面是inte***ce實現的多型版本
public
inte***ce
ishape
public
class
rectangle :ishape
} public
class
square:ishape
} class
program
console.readline();
} }
抽象類與介面
類可以實現無限個介面,但僅能從乙個抽象(或任何其他型別)類繼承。從抽象類派生的類仍可實現介面。msdn的在介面和抽象類的選擇方面給的一些建議,
如果預計要建立元件的多個版本,則建立抽象類。抽象類提供簡單易行的方法來控制項版本。通過更新基類,所有繼承類都隨更改自動更新。另一方面,介面一旦建立就不能更改。如果需要介面的新版本,必須建立乙個全新的介面。
如果建立的功能將在大範圍的全異物件間使用,則使用介面。抽象類應主要用於關係密切的物件,而介面最適合為不相關的類提供通用功能。
如果要設計小而簡練的功能塊,則使用介面。如果要設計大的功能單元,則使用抽象類。
如果要在元件的所有實現間提供通用的已實現功能,則使用抽象類。抽象類允許部分實現類,而介面不包含任何成員的實現。
乙個綜合性的例項
public
inte***ce
ishape
public
class
shape:ishape
public
virtual
void draw() }
public
class
rectangle :shape,ishape
public
newvirtual
void draw() }
public
class
square :rectangle
} class
program
} /*
執行結果:
square override draw()
①square override draw()
②shape virtual draw()
③rectangle ishape.draw()④*/
在這個程式裡,把派生類例項賦給父類變數或者介面。對結果①無需解釋。結果②,因為draw方法是虛方法,虛方法的呼叫規則是呼叫離例項變數最近的override版本方法,square類中的draw方法是離例項square最近的方法,即使是把square型別的例項賦值給rectangle型別的變數去訪問,仍然呼叫的是square類重寫的方法。對於結果③,也是虛方法呼叫,在子類rectangle中的draw方法用new修飾,這就表明shape類中的virtual到此中斷,後面square中的override版是針對rectangle中的draw方法
,此時,離square例項最近的實現就是shape類中的draw 方法,因為shape類中的draw方法沒有override的版本只能呼叫本身的virtual版了。結果④,因為rectangle重新宣告實現介面ishape,介面呼叫同樣符合虛方法呼叫規則,呼叫離它最近的實現,rectangle中的實現比shape中的實現離例項square更近。rectangle中的ishape.draw()方法是顯式介面方法實現,對於它不能有任何的訪問修飾符,只能通過介面變數訪問它,同時也不能用virtual或者override進行修飾,也不能被派生型別呼叫。只能用ishape變數進行訪問。如果型別中有顯式介面的實現,而且用的是介面變數,預設呼叫顯式介面的實現方法。
override和方法選擇
public
class
base
} public
class
derived :base
public
void write(doublenum)
C 中的多型及多型的實現
c 中的多型分為靜多型和動多型兩種情況。靜多型是在編譯時就能確定呼叫函式的型別,包括過載和模板。動多型則是需要在執行時才能確定呼叫哪乙個函式。動多型的產生條件是需要在基類的指標指向派生類的物件,並呼叫派生類的函式。而要想呼叫派生類的函式,那麼基類裡這個函式應寫為虛函式。什麼是虛函式?所謂的虛函式就是...
C 中的多型和Objective C中的「多型」
c 中的多型 兩種 編譯時匹配 函式過載,依據成員函式的名字 形參型別 形參個數等不同來實現不同的函式呼叫匹配 執行時匹配 虛函式,具體就是通過將父類或抽象類宣告時成員函式宣告為virtual,然後子類繼承並實現,應用時,通過將子類物件位址賦給其父類型別的指標 注,抽象類不能例項化,即不能定義物件,...
C 中多型的實現
物件導向語言的主要特點是 封裝性 繼承性 多型性。其中,封裝性使得 模組化,繼承性完成 的復用,多型實現介面的重用。在c 中,多型性是指具有不同功能的函式用同乙個函式名。即用同乙個函式名,呼叫不同內容的函式。下面主要從多型的實現分析c 中的多型。多型的實現有兩種方式 靜態聯編和動態聯編。系統在編譯的...