總結:ide
1. 在繼承上, new/override沒區別spa
2. 在多態上,new不支持多態,override支持3d
在C#中改變類中相同名稱的方法的實現過程當中有三種方式:重載、重寫和覆蓋。 code
重載:指具備相同的方法名,經過改變參數的個數或者參數類型實現同名方法的不一樣實現。blog
重寫:則是隻在繼承中,子類經過override關鍵字修飾方法,實現父類和子類相同方法的不一樣實現,注意,父類方法必須是用virtual或者abstract關鍵字修飾的虛方法或者抽象方法繼承
覆蓋:則是指在繼承中,子類經過在與父類相同方法名以前用new修飾的一個新的方法的定義string
1.new ---- 子類隱藏父類的方法,覆蓋(總結:new關鍵字不支持多態)
it
下面的例子咱們能夠發現new 關鍵字,並不支持多態的應用io
咱們使用多態調用的任然仍是父類中的方法,也就是被隱藏的方法class
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("我是子類"); } } }
輸出:
