1.隱藏繼承的成員new / 虛方法(override)/ abstract / 多態 ----- 重寫


總結:

1. 在繼承上, new/override沒區別

2. 在多態上,new不支持多態,override支持

 

在C#中改變類中相同名稱的方法的實現過程中有三種方式:重載、重寫和覆蓋。

重載指具有相同的方法名,通過改變參數的個數或者參數類型實現同名方法的不同實現。

重寫:則是只在繼承中,子類通過override關鍵字修飾方法,實現父類和子類相同方法的不同實現,注意,父類方法必須是用virtual或者abstract關鍵字修飾的虛方法或者抽象方法

覆蓋:則是指在繼承中,子類通過在與父類相同方法名之前用new修飾的一個新的方法的定義

 

1.new ---- 子類隱藏父類的方法,覆蓋(總結:new關鍵字不支持多態

下面的例子我們可以發現new 關鍵字,並不支持多態的應用

我們使用多態調用的任然還是父類中的方法,也就是被隱藏的方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Father fa = new Son();
            fa.print();
        }
    }

    class Father
    {
        public  void print()
        {
            Console.WriteLine("我是父類");
        }
    }

    class Son : Father
    {
        public new void print()
        {
            Console.WriteLine("我是子類");
        }
    }
}

 輸出:

 

如果我們使用了多態創建了實例,要調用子類重寫的方法,需要強制轉換成子類類型,實例如下:

class Program
    {
        static void Main(string[] args)
        {
            Father fa = new Son();
            Son so = (Son)fa;
            so.print();
        }
    }

 

輸出:

 

 

2.virtual-- 重寫 abstract--實現 (總結:這兩種都支持多態)

a.重寫父類的方法要用到override關鍵字(具有override關鍵字修飾的方法是對父類中同名方法的新實現)
b.要重寫父類的方法,前提是父類中該要被重寫的方法必須聲明為virtual或者是abstract類型。(virtual修飾的可以有方法體,子類不一定要重寫 abstract沒有方法體,子類必須要實現)
C.virtual關鍵字用於將方法定義為支持多態,有virtual關鍵字修飾的方法稱為“虛擬方法”

實例如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Father fa = new Son();
            fa.print();
        }
    }

    class Father
    {
        public virtual void print()
        {
            Console.WriteLine("我是父類");
        }
        
    }

    class Son : Father
    {
        public override void print()
        {
            Console.WriteLine("我是子類");
        }
    }
}
輸出:

 


免責聲明!

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



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