C#中重寫(override)、覆蓋(new)、虛擬(Virtual)關鍵字的區別
阿新 • • 發佈:2019-01-30
虛擬(Virtual) :
virtual 關鍵字用於修飾方法、屬性、索引器或事件宣告,並使它們可以在派生類中被重寫。
預設情況下,方法是非虛擬的。不能重寫非虛方法。
virtual修飾符不能與static、abstract, private或override修飾符一起使用。
重寫(override)
用關鍵字 virtual 修飾的方法,叫虛方法。可以在子類中用override 宣告同名的方法,這叫“重寫”。相應的沒有用virtual修飾的方法,我們叫它實方法。重寫會改變父類方法的功能。
看下面演示程式碼: #region 重寫
public class C1
{
public virtual string GetName()
{
return "叔祥";
}
}
public class C2 : C1
{
public override string GetName()
{
return "xiangshu";
}
}
C1 c1 = new C1();
Console.WriteLine(c1.GetName());//輸出“祥叔”
C2 c2 = new C2();
Console.WriteLine(c2.GetName());//輸出“xiangshu”
//重點看這裡
Console.WriteLine(c3.GetName());//輸出“xiangshu”
#endregion 覆蓋 (new)
在子類中用 new 關鍵字修飾 定義的與父類中同名的方法,叫覆蓋。
覆蓋不會改變父類方法的功能。 看下面演示程式碼: #region 覆蓋
public class C1
{
public string GetName()
{
return "祥叔";
}
}
public class C2 : C1
{
public new string GetName()
{
return "xiangshu";
}
}
C1 c1 = new C1();
Console.WriteLine(c1.GetName());//輸出“祥叔”
C2 c2 = new C2();
Console.WriteLine(c2.GetName());//輸出“xiangshu”
//重點看這裡,和上面的重寫作比較
Console.WriteLine(c3.GetName());//輸出“祥叔”
#endregion
總結
1:不管是重寫還是覆蓋都不會影響父類自身的功能(廢話,肯定的嘛,除非程式碼被改)。
2:當用子類建立父類的時候,如 C1 c3 = new C2(),重寫會改變父類的功能,即呼叫子類的功能;而覆蓋不會,仍然呼叫父類功能。
3:虛方法、實方法都可以被覆蓋(new),抽象方法,介面 不可以。
4:抽象方法,介面,標記為virtual的方法可以被重寫(override),實方法不可以。
5:重寫使用的頻率比較高,實現多型;覆蓋用的頻率比較低,用於對以前無法修改的類進行繼承的時候。