C#中重寫(override)和覆蓋(new)的區別

重寫ide

用關鍵字 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」
 
 //重點看這裏
 
 C1 c3 = new C2();
 Console.WriteLine(c3.GetName());//輸出「xiangshu」
#endregion
覆蓋 
在子類中用 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」
 
//重點看這裏,和上面的重寫做比較
 
C1 c3 = new C2();
Console.WriteLine(c3.GetName());//輸出「祥叔」
#endregion

總結繼承

1:無論是重寫仍是覆蓋都不會影響父類自身的功能(廢話,確定的嘛,除非代碼被改)。接口

2:當用子類建立父類的時候,如 C1 c3 = new C2(),重寫會改變父類的功能,即調用子類的功能;而覆蓋不會,仍然調用父類功能。string

3:虛方法、實方法均可以被覆蓋(new),抽象方法,接口 不能夠。it

4:抽象方法,接口,標記爲virtual的方法能夠被重寫(override),實方法不能夠。io

5:重寫使用的頻率比較高,實現多態;覆蓋用的頻率比較低,用於對之前沒法修改的類進行繼承的時候。class

相關文章
相關標籤/搜索