程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#中重寫(override)和覆蓋(new)的區別

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

編輯:C#入門知識

重寫
用關鍵字 virtual 修飾的方法,叫虛方法。可以在子類中用override 聲明同名的方法,這叫“重寫”。相應的沒有用virtual修飾的方法,我們叫它實方法。
重寫會改變父類方法的功能。
看下面演示代碼:
#region 重寫

public class C1
{
    public virtual string GetName()
    {
        return "徐明祥";
    }
}

public class C2 : C1
{
    public override string GetName()
    {
        return "xumingxiang";
    }
}

 C1 c1 = new C1();
 Console.WriteLine(c1.GetName());//輸出“徐明祥”

 C2 c2 = new C2();
 Console.WriteLine(c2.GetName());//輸出“xumingxiang”
 //重點看這裡
 C1 c3 = new C2();
 Console.WriteLine(c3.GetName());//輸出“xumingxiang”

#endregion
 
覆蓋
在子類中用 new 關鍵字修飾 定義的與父類中同名的方法,叫覆蓋。
覆蓋不會改變父類方法的功能。
看下面演示代碼:
#region 覆蓋

public class C1
{
    public string GetName()
    {
        return "徐明祥";
    }
}

public class C2 : C1
{
    public new string GetName()
    {
        return "xumingxiang";
    }
}

C1 c1 = new C1();
Console.WriteLine(c1.GetName());//輸出“徐明祥”

C2 c2 = new C2();
Console.WriteLine(c2.GetName());//輸出“xumingxiang”
//重點看這裡,和上面的重寫作比較
C1 c3 = new C2();
Console.WriteLine(c3.GetName());//輸出“徐明祥”

#endregion
 
總結
1:不管是重寫還是覆蓋都不會影響父類自身的功能(廢話,肯定的嘛,除非代碼被改)。
2:當用子類創建父類的時候,如 C1 c3 = new C2(),重寫會改變父類的功能,即調用子類的功能;而覆蓋不會,仍然調用父類功能。
3:虛方法、實方法都可以被覆蓋(new),抽象方法,接口 不可以。
4:抽象方法,接口,標記為virtual的方法可以被重寫(override),實方法不可以。
5:重寫使用的頻率比較高,實現多態;覆蓋用的頻率比較低,用於對以前無法修改的類進行繼承的時候。

 

作者 : 徐明祥

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved