C# 重寫(override)和覆蓋(new)


重寫

用關鍵字 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


免責聲明!

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



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