基礎才是重中之重~方法override詳解

張佔嶺發表於2013-11-09

回到 目錄

之所以寫這篇文章,完全是因為這次程式碼稽核,這次程式碼稽核過程當中,出現了很多我認為基礎知識不夠紮實的問題,所以,打算把它們記錄下來,共大家分享。

方法的override,即方法的覆寫或者重寫,有時還是習慣叫它英文override,它是指將父類的abstract或者virtual方法進行重新設計,可以將新的功能加入其中,看起來很不錯,但在使用過程中,有時我們可能拿不準它,下面我說幾點:

一  父類是抽象類,這時,它的例項化需要通過子類來完成,這時的override是子類最後重寫的

二  父類是普通類,這時,它的例項化工作如果由自己完成,結果就是父類virtual的結果,與它的子類無關。

三  父類是普通類,它的例項化工作如果由子類完成,那麼,它的結果就是子類方法override的結果

OK,下面我們來說一下例子,它由father類和sons類組成,father類是一個普通類,在這實現當中,它很可能是個泛型類,如倉儲模式的實現

   /// <summary>
    /// 一個爸爸
    /// </summary>
    class Father
    {
        public virtual void print()
        {
            Console.WriteLine("我是爸爸");
        }
    }

下面是兒子A對爸爸的print方法的重寫工作

    /// <summary>
    /// 一個兒子A
    /// </summary>
    class SonA : Father
    {
        public override void print()
        {
            Console.WriteLine("我是兒子");//override father class print method.
        }

        public void sonPrint()
        {
            base.print(); //我是爸爸
            print();//我是兒子

        }
    }

而下面是對print方法的各種呼叫工作,包括了實現化的方式

     static void Main(string[] args)
        {

            SonA son = new SonA();
            son.sonPrint(); //我是爸爸,我是兒子
            Father father = new Father();
            father.print();//我是爸爸
            Father son2 = new SonA();
            son2.print();//兒是兒子
        }

OK,通過結果我們可以看出:

在兒子類裡,base.print()方法走的是爸爸的print;print走的是兒子

在兒子類以外,使用爸爸自己去例項化後,print走的是爸爸的;使用兒子進行例項化後,print方法走的是兒子重寫後的;

回到 目錄

相關文章