之所以寫這篇文章,完全是因為這次程式碼稽核,這次程式碼稽核過程當中,出現了很多我認為基礎知識不夠紮實的問題,所以,打算把它們記錄下來,共大家分享。
方法的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方法走的是兒子重寫後的;