本身用C#寫個東西玩的,碰到點面向對象的問題,代碼以下:ide
abstract class AbsClass { virtual protected void method() { //do something } public void doMethod() { //do something method(); //do other things } } class RideClass : AbsClass { protected void method() { //sub class doing } } class Execute { public void main() { AbsClass c = new RideClass(); c.doMethod(); } }
我原意是但願在抽象類中調用的method方法,若是繼承類沒有重寫,則調用抽象類的method,若是繼承類重寫了則調用繼承類。spa
可是事情每每事與願違,其結果是不管如何都不會調用繼承類的method方法。此時,若是將doMethod方法移到繼承類中(例子中就是RideClass),則能夠實現個人要求,但這顯然違背了面向對象的初衷,也不利於後期的維護。.net
所以,我就跑到MSDN上去詢問了有關問題,最終圓滿解決。在其餘語言平臺不清楚,至少在.net framework(C#語言,其餘語言同樣 只是關鍵字可能不一樣)裏,若是須要使用「派生——繼承」的關係,則必須顯式的申明virtual-override關鍵字。code
在這個例子中,AbsClass.method方法使用了virtual修飾,可是RideClass.method方法並無override修飾符(沒有override修飾,自動認爲使用了new修飾符),所以在C#中,編譯器認爲該方法僅僅是與父類方法的一個同名方法而已,除此以外再也不有任何關係。而且在子類中,將父類的method方法進行了隱藏。所謂「隱藏」,即實例化一個RideClass類的實例,該實例將不可見父類的method方法(例子中,原本就不可見,由於訪問限制符是protected)。對象
所以,要實現我最初的的想法,只須要簡單在繼承類中顯式的申明override便可。blog
1 class RideClass : AbsClass 2 { 3 override protected void method() 4 { 5 //sub class doing 6 } 7 }