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> 5 public class Animal 6 { 7 public virtual void Eatting() 8 { 9 Console.WriteLine("用嘴吃飯!"); 10 } 11 } 12 13 #region 重寫(覆蓋原則) 14 15 public class Pople : Animal 16 { 17 public override void Eatting() //基類必須是virtual方法 18 { 19 Console.WriteLine("人用筷子吃飯!"); 20 } 21 } 22 23 public class Monkey : Animal 24 { 25 public new void Eatting() 26 { 27 Console.WriteLine("猴子直接用手吃飯!"); 28 } 29 } 30 31 32 #endregion 33 34 /// <summary> 35 /// 方法重載和沖寫的區別 36 /// </summary> 37 /// <param name="args"></param> 38 public static void Main(string[] args) 39 { 40 var pople = new Pople(); 41 (pople as Animal).Eatting(); //打印【人用筷子吃飯!】 42 pople.Eatting();//打印【人用筷子吃飯!】 43 44 var monKey = new Monkey(); 45 (monKey as Animal).Eatting();//打印【用嘴吃飯!】 46 monKey.Eatting();//打印【猴子直接用手吃飯!】 47 48 Console.ReadKey(); 49 }
2).重載(overload)
overload是重載,一般是用於在一個類實現若干重載的方法,這些方法的名稱相同參數不同。
重載的規則:
1.在使用重載時只能通過相同的方法名,不同的參數形式類實現。不同的參數類型可以是不同的參數類型,不同的參數個數,不同的參數順序(參數類型必須不一樣)。
2.不能通過訪問權限,返回類型,拋出的異常進行重載。
3.方法的異步類型和數目不會對重載造成影響。
1 using System; 2 using System.Threading.Tasks; 3 4 namespace OverReadOverLoadDifference 5 { 6 class Program 7 { 8 #region 方法重載 9 10 /// <summary> 11 /// 定義計算類 12 /// </summary> 13 public class Calculation 14 { 15 public int sunMation(int a) 16 { 17 return a; 18 } 19 20 public int sunMation(int a, int b) 21 { 22 return a + b; 23 } 24 } 25 26 #endregion 27 28 /// <summary> 29 /// 方法重載 30 /// </summary> 31 /// <param name="args"></param> 32 public static void Main(string[] args) 33 { 34 #region 重載 35 var calculation = new Calculation(); 36 Console.WriteLine(calculation.sunMation(1)); 37 Console.WriteLine(calculation.sunMation(2, 3)); 38 #endregion 39 40 Console.ReadKey(); 41 } 42 } 43 }
