日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

实例讲解override和new的区别

發(fā)布時(shí)間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实例讲解override和new的区别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、override:Override關(guān)鍵字主要是提供派生類對(duì)基類方法的新實(shí)現(xiàn)。

1、不可以用于重寫(xiě)非虛方法和靜態(tài)方法

2、與其配套使用的關(guān)鍵字是Virtual、abstract、Override。

3、不能使用修飾符 new、static、virtual 或 abstract 來(lái)修改 override 方法。


?

二、new:new關(guān)鍵字可以在派生類中隱藏基類的方法,也就說(shuō)在使用派生類調(diào)用的方法是New關(guān)鍵字新定義出來(lái)的方法,而不是基類的方法。在不使用New關(guān)鍵字來(lái)隱藏基類方法也是可以的,編譯器會(huì)出現(xiàn)一個(gè)警告,提示如果有意去隱藏基類的方法,請(qǐng)使用New關(guān)鍵字修飾。

可以對(duì)基類的虛方法、普通方法進(jìn)行操作


三、Virtual:允許在派生類中重寫(xiě)這些對(duì)象,默認(rèn)情況下,方法是非虛擬的,不可以重寫(xiě)。virtual關(guān)鍵字不可以與static、abstract、private、override一起使用。Virtual關(guān)鍵字和override緊密不可分的,如果要實(shí)現(xiàn)Virtual方法就必須要使用override或new關(guān)鍵字(new和override產(chǎn)生的機(jī)理不同)。


四、下面一個(gè)小例子進(jìn)行講解,耐心看完,一目了然。

class A { public virtual void Func() // 注意virtual,表明這是一個(gè)虛擬函數(shù) { Console.WriteLine("Func In A"); } } class B : A // 注意B是從A類繼承,所以A是父類,B是子類 { public override void Func() // 注意override ,表明重新實(shí)現(xiàn)了虛函數(shù) { Console.WriteLine("Func In B"); } } class C : B // 注意C是從B類繼承,所以B是父類,C是子類 { } class D : A // 注意D是從A類繼承,所以A是父類,D是子類 { public new void Func() // 注意new ,表明覆蓋父類里的同名類,而不是重新實(shí)現(xiàn) { Console.WriteLine("Func In D"); } } class Program { static void Main(string[] args) { A a; // 定義一個(gè)a這個(gè)A類的對(duì)象.這個(gè)A就是a的申明類 A b; // 定義一個(gè)b這個(gè)A類的對(duì)象.這個(gè)A就是b的申明類 A c; // 定義一個(gè)c這個(gè)A類的對(duì)象.這個(gè)A就是c的申明類 A d; // 定義一個(gè)d這個(gè)A類的對(duì)象.這個(gè)A就是d的申明類 a = new A(); // 實(shí)例化a對(duì)象,A是a的實(shí)例類 b = new B(); // 實(shí)例化b對(duì)象,B是b的實(shí)例類 c = new C(); // 實(shí)例化c對(duì)象,C是c的實(shí)例類 d = new D(); // 實(shí)例化d對(duì)象,D是d的實(shí)例類 a.Func(); // 執(zhí)行a.Func:1.先檢查申明類A 2.檢查到是虛擬方法 3.轉(zhuǎn)去檢查實(shí)例類A,就為本身 4.執(zhí)行實(shí)例類A中的方法 5.輸出結(jié)果 Func In A b.Func(); // 執(zhí)行b.Func:1.先檢查申明類A 2.檢查到是虛擬方法 3.轉(zhuǎn)去檢查實(shí)例類B,有重載的 4.執(zhí)行實(shí)例類B中的方法 5.輸出結(jié)果 Func In B c.Func(); // 執(zhí)行c.Func:1.先檢查申明類A 2.檢查到是虛擬方法 3.轉(zhuǎn)去檢查實(shí)例類C,無(wú)重載的 4.轉(zhuǎn)去檢查類C的父類B,有重載的 5.執(zhí)行父類B中的Func方法 5.輸出結(jié)果 Func In B d.Func(); // 執(zhí)行d.Func:1.先檢查申明類A 2.檢查到是虛擬方法 3.轉(zhuǎn)去檢查實(shí)例類D,無(wú)重載的(這個(gè)地方要注意了,雖然D里有實(shí)現(xiàn)Func(),但沒(méi)有使用override關(guān)鍵字,所以不會(huì)被認(rèn)為是重載) 4.轉(zhuǎn)去檢查類D的父類A,就為本身 5.執(zhí)行父類A中的Func方法 5.輸出結(jié)果 Func In A D d1 = new D(); d1.Func(); // 執(zhí)行D類里的Func(),輸出結(jié)果 Func In D Console.ReadLine(); } }

?

?1、首先檢查的都是申明類

2、如果申明類是虛方法,則去檢查實(shí)例類

3、如果實(shí)例類沒(méi)實(shí)現(xiàn),則使用父類中的虛方法。(優(yōu)先級(jí)最后)

4、new的時(shí)候,雖然繼承類中也有同名方法,但是已經(jīng)與父類那個(gè)沒(méi)有關(guān)系。故也不會(huì)調(diào)用到這個(gè)方法。除非是以子類申明的對(duì)象才能調(diào)用的到。

?

轉(zhuǎn)載于:https://www.cnblogs.com/xyang/archive/2012/05/08/2490092.html

總結(jié)

以上是生活随笔為你收集整理的实例讲解override和new的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。