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