重写(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> 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 }