基礎才(cai)是重中之重~方法override詳(xiang)解(jie)
之(zhi)所以寫這篇文(wen)章,完全是(shi)因為這次(ci)代碼審核(he),這次(ci)代碼審核(he)過程當中,出現了很多我認(ren)為基礎知(zhi)識(shi)不夠扎實(shi)的問題,所以,打算(suan)把它們記錄下(xia)來(lai),共大家分享。
方法(fa)的(de)override,即方法(fa)的(de)覆寫(xie)或者重寫(xie),有時還是習慣叫它(ta)英文override,它(ta)是指(zhi)將父類的(de)abstract或者virtual方法(fa)進行(xing)重新設(she)計,可(ke)以(yi)將新的(de)功能加入(ru)其中,看起來很不(bu)錯(cuo),但在使用過程中,有時我們可(ke)能拿不(bu)準它(ta),下(xia)面我說幾點(dian):
一 父類(lei)是抽象類(lei),這時,它的實例化需(xu)要通過子(zi)類(lei)來完成,這時的override是子(zi)類(lei)最后重寫的
二 父類(lei)(lei)是普通類(lei)(lei),這時,它(ta)的(de)(de)實例化工作如果由(you)自(zi)己完(wan)成(cheng),結果就是父類(lei)(lei)virtual的(de)(de)結果,與它(ta)的(de)(de)子類(lei)(lei)無關。
三 父類是普通類,它(ta)的實例化工作如果由子類完成,那(nei)么,它(ta)的結果就是子類方法override的結果
OK,下(xia)(xia)面我(wo)們(men)來說一下(xia)(xia)例(li)子,它由father類和sons類組成,father類是(shi)一個普(pu)通類,在這實現當中,它很可能(neng)是(shi)個泛型(xing)類,如倉儲(chu)模(mo)式的實現
/// <summary> /// 一個爸爸 /// </summary> class Father { public virtual void print() { Console.WriteLine("我是爸爸"); } }
下面是兒(er)子A對爸爸的print方法的重寫工作(zuo)
/// <summary> /// 一個兒子A /// </summary> class SonA : Father { public override void print() { Console.WriteLine("我是(shi)兒子");//override father class print method. } public void sonPrint() { base.print(); //我是爸爸 print();//我是兒子 } }
而下面是對print方法的各種(zhong)調用(yong)工作,包括了實現化的方式
static void Main(string[] args) { SonA son = new SonA(); son.sonPrint(); //我是爸爸,我是兒子 Father father = new Father(); father.print();//我是爸爸 Father son2 = new SonA(); son2.print();//兒(er)是兒(er)子 }
OK,通過結果(guo)我們可以看出:
在兒(er)子類里(li),base.print()方(fang)法走(zou)的(de)是爸爸的(de)print;print走(zou)的(de)是兒(er)子
在兒子類以(yi)外,使(shi)用爸爸自己去實例化后(hou),print走的(de)是爸爸的(de);使(shi)用兒子進行(xing)實例化后(hou),print方法走的(de)是兒子重寫后(hou)的(de);