重写(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         }
演示代码demo

 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 }
演示代码demo

 

posted @ 2018-10-12 11:42  代码驿站  阅读(2811)  评论(0编辑  收藏  举报