重寫
用關鍵字 virtual 修飾的方法,叫虛方法。可以在子類中用override 聲明同名的方法,這叫“重寫”。相應的沒有用virtual修飾的方法,我們叫它實方法。
重寫會改變父類方法的功能。
重寫會改變父類方法的功能。
覆蓋
在子類中用 new 關鍵字修飾 定義的與父類中同名的方法,叫覆蓋。
覆蓋不會改變父類方法的功能。
示例代碼:(C# 控制台程序)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp4 { public class GetTheName { public virtual string ReWrite_Get() // 實現重寫的虛方法 { return "父類"; } public string Cover_Get() // 實現覆蓋實方法 { return "父類"; } } public class Rewrite : GetTheName // 繼承父類的重寫子類 { public override string ReWrite_Get() { return "父類被改變"; } } public class Cover : GetTheName // 繼承父類的覆蓋子類 { public new string Cover_Get() { return "父類被改變"; } } class Program { static void Main(string[] args) { GetTheName getTheName = new GetTheName(); // 對父類實例化 Console.WriteLine(getTheName.ReWrite_Get()); // 調用父類虛方法 Console.WriteLine(getTheName.Cover_Get()); // 調用父類實方法 GetTheName rewrite = new Rewrite(); // 用子類創建父類對象 Console.WriteLine(rewrite.ReWrite_Get()); GetTheName ovverides = new Cover(); // 用子類創建父類對象 Console.WriteLine(ovverides.Cover_Get()); Console.ReadKey(); } } }
結果:
總結
1:不管是重寫還是覆蓋都不會影響父類自身的功能(廢話,肯定的嘛,除非代碼被改)。
2:當用子類創建父類的時候,如 C1 c3 = new C2(),重寫會改變父類的功能,即調用子類的功能;而覆蓋不會,仍然調用父類功能。
3:虛方法、實方法都可以被覆蓋(new),抽象方法,接口 不可以。
4:抽象方法,接口,標記為virtual的方法可以被重寫(override),實方法不可以。
5:重寫使用的頻率比較高,實現多態;覆蓋用的頻率比較低,用於對以前無法修改的類進行繼承的時候。
參考: https://www.cnblogs.com/Look_Sun/p/4551164.html