總結:
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("我是子類"); } } }
輸出:
