重寫(override)和過載(overload)的區別
1).重寫(override)
override是重寫(覆蓋)了一個方法,以實現不同的功能,一般的用於子類在繼承父類時,重寫(重新實現)父類的方法,實現不同的需求。
重寫(覆蓋)的規則:
1.重寫的方法必須是virtual,abstract或者是override(virtual修飾符不能與static,abstract,private或override修飾符一起使用,靜態屬性上使用virtual修飾符會報錯)。
2.重寫方法的引數列表必須完全與被重寫的方法相同,否則不能稱為重寫而是過載。
3.重寫的方法的訪問修飾符一定要大於被重寫方法的訪問修飾符(public>protected>default>private)。
4.重寫的方法的返回值必須和被重寫的方法返回值一致。
5.重寫的方法所丟擲的異常必須和被重寫的方法所丟擲的異常一致,或是其子類(eg:父類的一個方法申明瞭一個檢查異常IOException,在重寫這個方法就不能丟擲Exception,只能丟擲IOException的子類異常,可以丟擲非檢查異常)。
6.被重寫的方法不能為private,否則在其子類中只是定義了一個新的方法,並沒有對其重寫。
7.靜態方法不能被重寫為非靜態方法(會編譯出錯)。
8.子類不能重寫父類中的final修飾的方法。
1 /// <summary> 2/// 定能基類動物類 3/// </summary> 4/// <returns></returns> 5public class Animal 6{ 7public virtual void Eatting() 8{ 9Console.WriteLine("用嘴吃飯!"); 10} 11} 12 13#region 重寫(覆蓋原則) 14 15public class Pople : Animal 16{ 17public override void Eatting() //基類必須是virtual方法 18{ 19Console.WriteLine("人用筷子吃飯!"); 20} 21} 22 23public class Monkey : Animal 24{ 25public new void Eatting() 26{ 27Console.WriteLine("猴子直接用手吃飯!"); 28} 29} 30 31 32#endregion 33 34/// <summary> 35/// 方法過載和衝寫的區別 36/// </summary> 37/// <param name="args"></param> 38public static void Main(string[] args) 39{ 40var pople = new Pople(); 41(pople as Animal).Eatting(); //列印【人用筷子吃飯!】 42pople.Eatting();//列印【人用筷子吃飯!】 43 44var monKey = new Monkey(); 45(monKey as Animal).Eatting();//列印【用嘴吃飯!】 46monKey.Eatting();//列印【猴子直接用手吃飯!】 47 48Console.ReadKey(); 49} 演示程式碼demo
2).過載(overload)
overload是過載,一般是用於在一個類實現若干過載的方法,這些方法的名稱相同引數不同。
過載的規則:
1.在使用過載時只能通過相同的方法名,不同的引數形式類實現。不同的引數型別可以是不同的引數型別,不同的引數個數,不同的引數順序(引數型別必須不一樣)。
2.不能通過訪問許可權,返回型別,丟擲的異常進行過載。
3.方法的非同步型別和數目不會對過載造成影響。
1 using System; 2 using System.Threading.Tasks; 3 4 namespace OverReadOverLoadDifference 5 { 6class Program 7{ 8#region 方法過載 9 10/// <summary> 11/// 定義計算類 12/// </summary> 13public class Calculation 14{ 15public int sunMation(int a) 16{ 17return a; 18} 19 20public int sunMation(int a, int b) 21{ 22return a + b; 23} 24} 25 26#endregion 27 28/// <summary> 29/// 方法過載 30/// </summary> 31/// <param name="args"></param> 32public static void Main(string[] args) 33{ 34#region 過載 35var calculation = new Calculation(); 36Console.WriteLine(calculation.sunMation(1)); 37Console.WriteLine(calculation.sunMation(2, 3)); 38#endregion 39 40Console.ReadKey(); 41} 42} 43 } 演示程式碼demo