天天看點

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

重寫

用關鍵字 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(),重寫會改變父類的功能,即調用子類的功能;而覆寫不會,仍然調用父類功能。

3:虛方法、實方法都可以被覆寫(new),抽象方法,接口 不可以。

4:抽象方法,接口,标記為virtual的方法可以被重寫(override),實方法不可以。

5:重寫使用的頻率比較高,實作多态;覆寫用的頻率比較低,用于對以前無法修改的類進行繼承的時候。

繼續閱讀