.net下繼承與派生關係

本身用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     }
View Code
相關文章
相關標籤/搜索