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:重寫使用的頻率比較高,實現多態;覆蓋用的頻率比較低,用於對以前無法修改的類進行繼承的時候。

 

原文地址:http://www.cnblogs.com/xumingxiang/archive/2012/04/14/override_new.html

作者 :
出處: http://www.cnblogs.com/xumingxiang 
版權:本文版權歸作者和博客園共有
轉載:歡迎轉載,為了保存作者的創作熱情,請按要求【轉載】,謝謝
要求:未經作者同意,必須保留此段聲明;必須在文章中給出原文連接;否則必究法律責任


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM