1. 重寫和覆蓋的定義 1.1 重寫(override)的定義 在C#中,用override關鍵字來重寫一個父類中的虛方法或抽象方法。override關鍵字用於指示編譯器,我要用派生類中的一個方法,重寫基類中的同名方法。通過重寫基類中的方法,可以實現多態性。有關重寫與虛方法和抽象方法的詳細示例,可移 ...
1. 重寫和覆蓋的定義
1.1 重寫(override)的定義
在C#中,用override關鍵字來重寫一個父類中的虛方法或抽象方法。override關鍵字用於指示編譯器,我要用派生類中的一個方法,重寫基類中的同名方法。通過重寫基類中的方法,可以實現多態性。有關重寫與虛方法和抽象方法的詳細示例,可移步C#虛方法和抽象方法示例。
override關鍵字的語法如下:
public override returnType MethodName(ParameterList)
{
// 方法實現
}
其中,public表示訪問修飾符;override表示重寫虛方法或抽象方法;returnType表示方法的返回類型;MethodName表示方法名稱;ParameterList表示方法的參數列表。
需要註意的是,重寫方法的訪問修飾符必須與被重寫方法的訪問修飾符相同或更為寬鬆。
1.2 覆蓋(new)的定義
在C#中,用new關鍵字來覆蓋一個父類中的成員方法或成員變數。new關鍵字用於指示編譯器,派生類中的一個方法或變數將隱藏基類中的同名方法或變數,從而改變了繼承體系中的原有佈局關係。
new關鍵字的語法如下:
new returnType MemberName(ParameterList)
{
// 成員實現
}
其中,returnType表示成員的返回類型;MemberName表示成員的名稱;ParameterList表示成員的參數列表。
2. 兩者的區別及示例
下麵是一個示例:
//父類
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中的覆蓋方法";
}
}
隨後通過程式入口函數調用:
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:當用子類創建父類的時候,如 FatherClass f1 = new SonClass1(),重寫會改變父類的功能,即調用子類的功能;而覆蓋不會,仍然調用父類功能。
3:虛方法、實方法都可以被覆蓋(new),但是抽象方法,介面 不可以。
4:抽象方法,介面,標記為virtual的方法可以被重寫(override),實方法不可以。
5:重寫使用的頻率比較高,實現多態;覆蓋用的頻率比較低,用於對以前無法修改的類進行繼承的時候。
小拓展:當使用new關鍵字覆蓋一個成員方法或變數時,隱藏的成員在類層次結構中的位置會改變,它會在派生類中被重新定義,而不是從基類中繼承。當基類對象引用派生類對象時,派生類中隱藏的成員不被基類引用所包含,因此它們無法訪問。而在派生類中,新定義的成員將起作用,完全與基類中的同名成員無關。