第二节:重写(new)、覆写(overwrite)、和重载(overload)
一. 重寫(xiě)
1.?關(guān)鍵字:new
2.?含義:子類繼承父類中的普通方法,如果在子類中重寫(xiě)了一個(gè)和父類中完全相同的方法,子類中會(huì)報(bào)警告(問(wèn)是否顯式的隱藏父類的中的方法),如果在子類中的方法前加上new關(guān)鍵字,則警告消失。
注意:
* 雖然可以不使用 new 修飾符來(lái)隱藏成員,但將收到編譯器警告。 如果使用 new 來(lái)顯式隱藏成員,將禁止此警告。
* 這里需要特別注意,隱藏父類方法是指聲明的完全是子類實(shí)例,? ? ? eg child類繼承parent類, 并在child類中重新聲明了一個(gè)和parent中相同的方法show。
那么分兩種情況:
* a. child c=new child(); c.show()進(jìn)行調(diào)用,無(wú)論child類中的show方法前加沒(méi)加new關(guān)鍵字,調(diào)用的都是child類中的方法,只是加上new關(guān)鍵字后,不出警告。
* b. parent p=new child(); p.show()進(jìn)行調(diào)用,無(wú)論child類中的show方法前加沒(méi)加new關(guān)鍵字,調(diào)用的都是parent類中的方法,因?yàn)檫@是不同方法,不涉及override,不滿足上述聲明的new關(guān)鍵字替換父類中的方法的描述。
3. 聲明一個(gè)parentClass父類,里面有三個(gè)方法。
1 public abstract class parentClass2 {3 //下面兩個(gè)普通方法實(shí)現(xiàn)自身的重載4 public void CommonMethord1()5 {6 Console.WriteLine("parentClass CommonMethord1");7 }8 public void CommonMethord1(string msg)9 { 10 Console.WriteLine("parentClass CommonMethord1"); 11 } 12 public void CommonMethord2() 13 { 14 Console.WriteLine("parentClass CommonMethord2"); 15 } 16 }4. 聲明一個(gè)childClass類,里面重寫(xiě)了兩個(gè)方法。
1 public class childClass : parentClass2 {3 /// <summary>4 /// 單獨(dú)聲明子類實(shí)例的時(shí)候,將替換父類中的方法5 /// </summary>6 public void CommonMethord1()7 {8 Console.WriteLine("childClass CommonMethord1");9 } 10 /// <summary> 11 /// new 關(guān)鍵字去除上述警告,單獨(dú)聲明子類實(shí)例的時(shí)候,將替換父類中的方法 12 /// </summary> 13 /// <param name="msg"></param> 14 public new void CommonMethord1(string msg) 15 { 16 Console.WriteLine("childClass CommonMethord1"); 17 } 18 }5. 調(diào)用
1 {2 parentClass p1 = new childClass();3 childClass p2 = new childClass();4 Console.WriteLine("-----------------------------1.子類的直接調(diào)用--------------------------------------");5 p2.CommonMethord1(); //結(jié)果:子類方法 (非顯式隱藏,但也隱藏了,會(huì)報(bào)警告)6 p2.CommonMethord1("ddd"); //結(jié)果:子類方法 (含有new關(guān)鍵字,顯式的隱藏了父類中的方法,沒(méi)有警告)7 p2.CommonMethord2(); //結(jié)果:父類方法8 9 Console.WriteLine("-----------------------------2.普通方法重寫(xiě),調(diào)用的都是父類方法--------------------------------------"); 10 p1.CommonMethord1(); //結(jié)果:父類方法 11 p1.CommonMethord1("ddd"); //結(jié)果:父類方法 12 p1.CommonMethord2(); //結(jié)果:父類方法 13 }二. 覆寫(xiě)
1.?關(guān)鍵字:override
2.?含義:在子類中,繼承的父類中的抽象方法(abstract)和虛方法(virtual),子類可以對(duì)其進(jìn)行覆寫(xiě),其中父類中的抽象方法,子類中必須被覆寫(xiě)。
抽象方法:沒(méi)有方法體,子類必須覆寫(xiě)。
虛方法:必須有方法體,子類可以對(duì)其進(jìn)行覆寫(xiě),也可以不進(jìn)行覆寫(xiě)。
3. 新建一個(gè)名叫parentClass的抽象類,里面有一個(gè)抽象方法和兩個(gè)虛方法。
1 public abstract class parentClass2 {3 //下面為抽象方法4 public abstract void abstractMethord();5 //下面兩個(gè)方法為虛方法6 public virtual void virtualMethord1()7 {8 Console.WriteLine("parentClass virtualMethord1");9 } 10 public virtual void virtualMethord2() 11 { 12 Console.WriteLine("parentClass virtualMethord2"); 13 } 14 }4. 新建一個(gè)childClass子類,繼承parentClass類,并且對(duì)virtualMethord2虛方法進(jìn)行覆寫(xiě)
1 public class childClass : parentClass2 {3 4 public override void abstractMethord()5 {6 Console.WriteLine("childClass abstractMethord");7 }8 //加上sealed關(guān)鍵字,子類將不能對(duì)其繼續(xù)進(jìn)行覆寫(xiě)9 public sealed override void virtualMethord2() 10 { 11 Console.WriteLine("childClass virtualMethord2"); 12 } 13 }5. 調(diào)用
1 parentClass p1 = new childClass();2 childClass p2 = new childClass();3 Console.WriteLine("-----------------------------1.子類的直接調(diào)用--------------------------------------");4 p2.abstractMethord(); //結(jié)果:子類方法5 p2.virtualMethord1(); //結(jié)果:父類方法6 p2.virtualMethord2(); //結(jié)果:子類方法7 Console.WriteLine("-----------------------------2.抽象類(符合里氏替換原則)的形式調(diào)用--------------------------------------");8 p1.abstractMethord(); //結(jié)果:子類方法9 p1.virtualMethord1(); //結(jié)果:父類方法 10 p1.virtualMethord2(); //結(jié)果:子類方法三. 重載(overload)
1.?關(guān)鍵字:無(wú)關(guān)鍵字
2.?含義:在同一個(gè)類中,同一個(gè)名稱的方法參數(shù)的個(gè)數(shù)不同、參數(shù)類型不同、參數(shù)個(gè)數(shù)和參數(shù)類型都不同
eg: parentClass中的CommonMethord1的兩個(gè)方法就是重載
總結(jié)
以上是生活随笔為你收集整理的第二节:重写(new)、覆写(overwrite)、和重载(overload)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 中信大众点评联名信用卡申请要多久
- 下一篇: 余额宝怎么了?收益不如1年期的定期存款,