一文詳解C#中重寫(xiě)(override)及覆蓋(new)的區(qū)別
1. 重寫(xiě)和覆蓋的定義
1.1 重寫(xiě)(override)的定義
在C#中,用override關(guān)鍵字來(lái)重寫(xiě)一個(gè)父類中的虛方法或抽象方法。override關(guān)鍵字用于指示編譯器,我要用派生類中的一個(gè)方法,重寫(xiě)基類中的同名方法。通過(guò)重寫(xiě)基類中的方法,可以實(shí)現(xiàn)多態(tài)性。有關(guān)重寫(xiě)與虛方法和抽象方法的詳細(xì)示例,可移步C#虛方法和抽象方法示例。
override關(guān)鍵字的語(yǔ)法如下:
public override returnType MethodName(ParameterList) { // 方法實(shí)現(xiàn) }
其中,public表示訪問(wèn)修飾符;override表示重寫(xiě)虛方法或抽象方法;returnType表示方法的返回類型;MethodName表示方法名稱;ParameterList表示方法的參數(shù)列表。
需要注意的是,重寫(xiě)方法的訪問(wèn)修飾符必須與被重寫(xiě)方法的訪問(wèn)修飾符相同或更為寬松。
1.2 覆蓋(new)的定義
在C#中,用new關(guān)鍵字來(lái)覆蓋一個(gè)父類中的成員方法或成員變量。new關(guān)鍵字用于指示編譯器,派生類中的一個(gè)方法或變量將隱藏基類中的同名方法或變量,從而改變了繼承體系中的原有布局關(guān)系。
new關(guān)鍵字的語(yǔ)法如下:
new returnType MemberName(ParameterList) { // 成員實(shí)現(xiàn) }
其中,returnType表示成員的返回類型;MemberName表示成員的名稱;ParameterList表示成員的參數(shù)列表。
2. 兩者的區(qū)別及示例
下面是一個(gè)示例:
//父類 public class FatherClass { public virtual string GetName() { return "我是父類中的虛擬方法"; } } //子類1 public class SonClass1 : FatherClass { public override string GetName() { return "我是子類1中的重寫(xiě)方法"; } } //子類2 public class SonClass2 : FatherClass { public new string GetName() { return "我是子類2中的覆蓋方法"; } }
隨后通過(guò)程序入口函數(shù)調(diào)用:
public class Program { public static void Main(string[] args) { FatherClass fatherClass = new FatherClass(); Console.Write("直接調(diào)用父類中的虛方法:"); Console.WriteLine(fatherClass.GetName()); SonClass1 s1 = new SonClass1(); Console.Write("直接調(diào)用子類1中的重寫(xiě)方法:"); Console.WriteLine(s1.GetName()); SonClass2 s2 = new SonClass2(); Console.Write("直接調(diào)用子類2中的覆蓋方法:"); Console.WriteLine(s2.GetName()); FatherClass f1 = new SonClass1(); Console.Write("聲明父類,調(diào)用子類1中的重寫(xiě)方法:"); Console.WriteLine(f1.GetName()); FatherClass f2 = new SonClass2(); Console.Write("聲明父類,調(diào)用子類2中的覆蓋方法:"); Console.WriteLine(f2.GetName()); } }
運(yùn)行程序,得到的結(jié)果如下:
直接調(diào)用父類中的虛方法:我是父類中的虛擬方法
直接調(diào)用子類1中的重寫(xiě)方法:我是子類1中的重寫(xiě)方法
直接調(diào)用子類2中的覆蓋方法:我是子類2中的覆蓋方法
聲明父類,調(diào)用子類1中的重寫(xiě)方法:我是子類1中的重寫(xiě)方法
聲明父類,調(diào)用子類2中的覆蓋方法:我是父類中的虛擬方法
總結(jié):
1:不管是重寫(xiě)還是覆蓋都不會(huì)影響父類自身的功能。
2:當(dāng)用子類創(chuàng)建父類的時(shí)候,如 FatherClass f1 = new SonClass1(),重寫(xiě)會(huì)改變父類的功能,即調(diào)用子類的功能;而覆蓋不會(huì),仍然調(diào)用父類功能。
3:虛方法、實(shí)方法都可以被覆蓋(new),但是抽象方法,接口 不可以。
4:抽象方法,接口,標(biāo)記為virtual的方法可以被重寫(xiě)(override),實(shí)方法不可以。
5:重寫(xiě)使用的頻率比較高,實(shí)現(xiàn)多態(tài);覆蓋用的頻率比較低,用于對(duì)以前無(wú)法修改的類進(jìn)行繼承的時(shí)候。
小拓展:當(dāng)使用new關(guān)鍵字覆蓋一個(gè)成員方法或變量時(shí),隱藏的成員在類層次結(jié)構(gòu)中的位置會(huì)改變,它會(huì)在派生類中被重新定義,而不是從基類中繼承。當(dāng)基類對(duì)象引用派生類對(duì)象時(shí),派生類中隱藏的成員不被基類引用所包含,因此它們無(wú)法訪問(wèn)。而在派生類中,新定義的成員將起作用,完全與基類中的同名成員無(wú)關(guān)。
到此這篇關(guān)于一文詳解C#中重寫(xiě)(override)及覆蓋(new)的區(qū)別的文章就介紹到這了,更多相關(guān)C# 重寫(xiě) 覆蓋內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# FileSystemWatcher 在監(jiān)控文件夾和文件時(shí)的使用方法
這篇文章主要介紹了C# FileSystemWatcher 在監(jiān)控文件夾和文件時(shí)的使用方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以參考下2020-06-06C#實(shí)現(xiàn)ProperTyGrid自定義屬性的方法
這篇文章主要介紹了C#實(shí)現(xiàn)ProperTyGrid自定義屬性的方法,主要通過(guò)接口ICustomTypeDescriptor實(shí)現(xiàn),需要的朋友可以參考下2014-09-09關(guān)于C# TabPage如何隱藏的問(wèn)題
TabPage沒(méi)有Visible屬性,所以只能通過(guò)設(shè)置將其與父控件(tabcontrol)的關(guān)聯(lián)性去除就好了,如下面代碼:2013-04-04關(guān)于C#生成MongoDB中ObjectId的實(shí)現(xiàn)方法
本篇文章小編為大家介紹,關(guān)于C#生成MongoDB中ObjectId的實(shí)現(xiàn)方法。需要的朋友參考下2013-04-04c#調(diào)用c++的DLL的實(shí)現(xiàn)方法
本文主要介紹了c#調(diào)用c++的DLL的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05C#通過(guò)NPOI導(dǎo)入導(dǎo)出數(shù)據(jù)EXCEL
這篇文章主要為大家詳細(xì)介紹了C#通過(guò)NPOI導(dǎo)入導(dǎo)出數(shù)據(jù)EXCEL,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02