一文詳解C#中重寫(xiě)(override)及覆蓋(new)的區(qū)別
1. 重寫(xiě)和覆蓋的定義
1.1 重寫(xiě)(override)的定義
在C#中,用override關(guān)鍵字來(lái)重寫(xiě)一個(gè)父類(lèi)中的虛方法或抽象方法。override關(guān)鍵字用于指示編譯器,我要用派生類(lèi)中的一個(gè)方法,重寫(xiě)基類(lèi)中的同名方法。通過(guò)重寫(xiě)基類(lèi)中的方法,可以實(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表示方法的返回類(lèi)型;MethodName表示方法名稱(chēng);ParameterList表示方法的參數(shù)列表。
需要注意的是,重寫(xiě)方法的訪問(wèn)修飾符必須與被重寫(xiě)方法的訪問(wèn)修飾符相同或更為寬松。
1.2 覆蓋(new)的定義
在C#中,用new關(guān)鍵字來(lái)覆蓋一個(gè)父類(lèi)中的成員方法或成員變量。new關(guān)鍵字用于指示編譯器,派生類(lèi)中的一個(gè)方法或變量將隱藏基類(lèi)中的同名方法或變量,從而改變了繼承體系中的原有布局關(guān)系。
new關(guān)鍵字的語(yǔ)法如下:
new returnType MemberName(ParameterList)
{
// 成員實(shí)現(xiàn)
}其中,returnType表示成員的返回類(lèi)型;MemberName表示成員的名稱(chēng);ParameterList表示成員的參數(shù)列表。
2. 兩者的區(qū)別及示例
下面是一個(gè)示例:
//父類(lèi)
public class FatherClass
{
public virtual string GetName()
{
return "我是父類(lèi)中的虛擬方法";
}
}
//子類(lèi)1
public class SonClass1 : FatherClass
{
public override string GetName()
{
return "我是子類(lèi)1中的重寫(xiě)方法";
}
}
//子類(lèi)2
public class SonClass2 : FatherClass
{
public new string GetName()
{
return "我是子類(lèi)2中的覆蓋方法";
}
}隨后通過(guò)程序入口函數(shù)調(diào)用:
public class Program
{
public static void Main(string[] args)
{
FatherClass fatherClass = new FatherClass();
Console.Write("直接調(diào)用父類(lèi)中的虛方法:");
Console.WriteLine(fatherClass.GetName());
SonClass1 s1 = new SonClass1();
Console.Write("直接調(diào)用子類(lèi)1中的重寫(xiě)方法:");
Console.WriteLine(s1.GetName());
SonClass2 s2 = new SonClass2();
Console.Write("直接調(diào)用子類(lèi)2中的覆蓋方法:");
Console.WriteLine(s2.GetName());
FatherClass f1 = new SonClass1();
Console.Write("聲明父類(lèi),調(diào)用子類(lèi)1中的重寫(xiě)方法:");
Console.WriteLine(f1.GetName());
FatherClass f2 = new SonClass2();
Console.Write("聲明父類(lèi),調(diào)用子類(lèi)2中的覆蓋方法:");
Console.WriteLine(f2.GetName());
}
}運(yùn)行程序,得到的結(jié)果如下:
直接調(diào)用父類(lèi)中的虛方法:我是父類(lèi)中的虛擬方法
直接調(diào)用子類(lèi)1中的重寫(xiě)方法:我是子類(lèi)1中的重寫(xiě)方法
直接調(diào)用子類(lèi)2中的覆蓋方法:我是子類(lèi)2中的覆蓋方法
聲明父類(lèi),調(diào)用子類(lèi)1中的重寫(xiě)方法:我是子類(lèi)1中的重寫(xiě)方法
聲明父類(lèi),調(diào)用子類(lèi)2中的覆蓋方法:我是父類(lèi)中的虛擬方法
總結(jié):
1:不管是重寫(xiě)還是覆蓋都不會(huì)影響父類(lèi)自身的功能。
2:當(dāng)用子類(lèi)創(chuàng)建父類(lèi)的時(shí)候,如 FatherClass f1 = new SonClass1(),重寫(xiě)會(huì)改變父類(lèi)的功能,即調(diào)用子類(lèi)的功能;而覆蓋不會(huì),仍然調(diào)用父類(lèi)功能。
3:虛方法、實(shí)方法都可以被覆蓋(new),但是抽象方法,接口 不可以。
4:抽象方法,接口,標(biāo)記為virtual的方法可以被重寫(xiě)(override),實(shí)方法不可以。
5:重寫(xiě)使用的頻率比較高,實(shí)現(xiàn)多態(tài);覆蓋用的頻率比較低,用于對(duì)以前無(wú)法修改的類(lèi)進(jìn)行繼承的時(shí)候。
小拓展:當(dāng)使用new關(guān)鍵字覆蓋一個(gè)成員方法或變量時(shí),隱藏的成員在類(lèi)層次結(jié)構(gòu)中的位置會(huì)改變,它會(huì)在派生類(lèi)中被重新定義,而不是從基類(lèi)中繼承。當(dāng)基類(lèi)對(duì)象引用派生類(lèi)對(duì)象時(shí),派生類(lèi)中隱藏的成員不被基類(lèi)引用所包含,因此它們無(wú)法訪問(wèn)。而在派生類(lèi)中,新定義的成員將起作用,完全與基類(lèi)中的同名成員無(wú)關(guān)。
到此這篇關(guān)于一文詳解C#中重寫(xiě)(override)及覆蓋(new)的區(qū)別的文章就介紹到這了,更多相關(guān)C# 重寫(xiě) 覆蓋內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#面向?qū)ο笾M實(shí)現(xiàn)商城購(gòu)物功能
這篇文章主要為大家詳細(xì)介紹了C#面向?qū)ο笾M實(shí)現(xiàn)商城購(gòu)物功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
C# Winform中實(shí)現(xiàn)主窗口打開(kāi)登錄窗口關(guān)閉的方法
這篇文章主要介紹了C# Winform中實(shí)現(xiàn)主窗口打開(kāi)登錄窗口關(guān)閉的方法,這在需要用戶(hù)名密碼的軟件項(xiàng)目中是必用的一個(gè)技巧,要的朋友可以參考下2014-08-08
c#之OpenFileDialog解讀(打開(kāi)文件對(duì)話框)
這篇文章主要介紹了c#之OpenFileDialog(打開(kāi)文件對(duì)話框),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Unity實(shí)現(xiàn)滑動(dòng)更換界面效果
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)滑動(dòng)更換界面效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
c#生成站點(diǎn)地圖(SiteMapPath)文件示例程序
這篇文章主要介紹了c#生成站點(diǎn)地圖(SiteMapPath)文件的示例,大家參考使用2013-11-11
C#對(duì)Excel表csv文件的讀寫(xiě)操作詳解
在C#編程中,CSV(Comma Separated Values)文件是一種常見(jiàn)的數(shù)據(jù)存儲(chǔ)格式,用于存儲(chǔ)表格數(shù)據(jù),如數(shù)據(jù)庫(kù)導(dǎo)出或報(bào)表,CSV文件以其簡(jiǎn)單、易于處理和跨平臺(tái)兼容性而受到廣泛使用,本篇文章將深入探討如何在C#中進(jìn)行CSV文件的讀寫(xiě)操作,需要的朋友可以參考下2024-12-12
C# 實(shí)現(xiàn)Distinct將對(duì)象按條件去重
這篇文章主要介紹了C# 實(shí)現(xiàn)Distinct將對(duì)象按條件去重,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12

