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關鍵字對應的方法調用。