C#中的多態特性

C#中的多態特徵與C++類似也存在相同的隱藏與運行時多態,但在C#中,隱藏特徵需要通過關鍵字顯示指明。在C#中,多態關鍵字有三個:

virtual: 如基類方法增加該關鍵字,則表明子類可重寫此方法,重寫分爲兩種:隱藏和多態。

new: 隱藏此方法,當進行類型賦值”slice”特徵時,不進行多態調用,默認方式。

override: 重載(擴展)此方法,實現虛表多態性。

當處在繼承鏈中,會根據定義的類、聲明的類、多態關鍵字來決定調用的方法,下面類的繼承結構如下:

new 關鍵字比較好理解,默認調用聲明類所對應的方法,如下面的代碼:

BaseClass bc = new BaseClass();
DerivedClass dc = new DerivedClass();
BaseClass bcdc = new DerivedClass();
DerivedClass sdc = new SubDerivedClass();
bc.Method1();//base-Method1
dc.Method1();//derived-Method1
bcdc.Method1();//base-Method1

因爲BaseClass、DerivedClass類中的Method1方法均爲new方式創建,隱藏基類方法,按照聲明類型解析。
override關鍵字擴展基類方法,在調用此方法時,按照override關鍵字從基類開始進行搜索到繼承鏈中最上面的方法(最後一個override定義的方法):

sdc.Method1();//SubDerivedClass-Method1
bc = sdc;
bc.Method1();//base-Method1

sdc從基類開始,發現SubDerivedClass爲override方法,調用此方法,而bc從基類開始搜索,發現DerivedClass爲new(隱藏)關鍵字,搜索截止,調用bc聲明類型關鍵字。

我們如果修改方法定義如下:

 

調用代碼如下:

bc.Method1();//base-Method1           
dc.Method1();//derived-Method1           
bcdc.Method1();//derived-Method1       
sdc.Method1();//derived-Method1
bc = sdc;
bc.Method1();//derived-Method1

對象bc即使是SuperDerivedClass類型,由於override只到達DerivedClass級別,調用函數爲DerivedClass對應的方法。

現在繼續將類結構和方法修改定義如下:

測試代碼如下:

SuperSubDerivedClass ssdc = new SuperSubDerivedClass();
bc = ssdc;
bc.Method1();//derived-Method1
sdc = ssdc;
sdc.Method1();//derived-Method1


這裏對象bc、sdc均從基類開始進行搜索到最後一個override關鍵字對應的方法調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章