一文詳解C#中重寫(override)及覆蓋(new)的區(qū)別
1. 重寫和覆蓋的定義
1.1 重寫(override)的定義
在C#中,用override關(guān)鍵字來重寫一個父類中的虛方法或抽象方法。override關(guān)鍵字用于指示編譯器,我要用派生類中的一個方法,重寫基類中的同名方法。通過重寫基類中的方法,可以實現(xiàn)多態(tài)性。有關(guān)重寫與虛方法和抽象方法的詳細示例,可移步C#虛方法和抽象方法示例。
override關(guān)鍵字的語法如下:
public override returnType MethodName(ParameterList)
{
// 方法實現(xiàn)
}其中,public表示訪問修飾符;override表示重寫虛方法或抽象方法;returnType表示方法的返回類型;MethodName表示方法名稱;ParameterList表示方法的參數(shù)列表。
需要注意的是,重寫方法的訪問修飾符必須與被重寫方法的訪問修飾符相同或更為寬松。
1.2 覆蓋(new)的定義
在C#中,用new關(guān)鍵字來覆蓋一個父類中的成員方法或成員變量。new關(guān)鍵字用于指示編譯器,派生類中的一個方法或變量將隱藏基類中的同名方法或變量,從而改變了繼承體系中的原有布局關(guān)系。
new關(guān)鍵字的語法如下:
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ù)調(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中的重寫方法:");
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中的重寫方法:");
Console.WriteLine(f1.GetName());
FatherClass f2 = new SonClass2();
Console.Write("聲明父類,調(diào)用子類2中的覆蓋方法:");
Console.WriteLine(f2.GetName());
}
}運行程序,得到的結(jié)果如下:
直接調(diào)用父類中的虛方法:我是父類中的虛擬方法
直接調(diào)用子類1中的重寫方法:我是子類1中的重寫方法
直接調(diào)用子類2中的覆蓋方法:我是子類2中的覆蓋方法
聲明父類,調(diào)用子類1中的重寫方法:我是子類1中的重寫方法
聲明父類,調(diào)用子類2中的覆蓋方法:我是父類中的虛擬方法
總結(jié):
1:不管是重寫還是覆蓋都不會影響父類自身的功能。
2:當用子類創(chuàng)建父類的時候,如 FatherClass f1 = new SonClass1(),重寫會改變父類的功能,即調(diào)用子類的功能;而覆蓋不會,仍然調(diào)用父類功能。
3:虛方法、實方法都可以被覆蓋(new),但是抽象方法,接口 不可以。
4:抽象方法,接口,標記為virtual的方法可以被重寫(override),實方法不可以。
5:重寫使用的頻率比較高,實現(xiàn)多態(tài);覆蓋用的頻率比較低,用于對以前無法修改的類進行繼承的時候。
小拓展:當使用new關(guān)鍵字覆蓋一個成員方法或變量時,隱藏的成員在類層次結(jié)構(gòu)中的位置會改變,它會在派生類中被重新定義,而不是從基類中繼承。當基類對象引用派生類對象時,派生類中隱藏的成員不被基類引用所包含,因此它們無法訪問。而在派生類中,新定義的成員將起作用,完全與基類中的同名成員無關(guān)。
到此這篇關(guān)于一文詳解C#中重寫(override)及覆蓋(new)的區(qū)別的文章就介紹到這了,更多相關(guān)C# 重寫 覆蓋內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# Winform中實現(xiàn)主窗口打開登錄窗口關(guān)閉的方法
這篇文章主要介紹了C# Winform中實現(xiàn)主窗口打開登錄窗口關(guān)閉的方法,這在需要用戶名密碼的軟件項目中是必用的一個技巧,要的朋友可以參考下2014-08-08

