1.overload (重载)关键字: 无
A.使用的地方:同一类里。(其实是同一类里同一名称的方法不同版本的一种叫法)
B.要重载的方法和被重载的方法要求:
1),方法名称相同;
2),参数列表不同: a或b;
a),参数个数不同;
b),参数个数相同,但至少有一个参数的类型不同;
3),参数返回值类型不能作为重载区分的依据;
2.override (覆写)关键字: override
使用 override 修饰符来修改方法、属性、索引器或事件。重写方法提供从基类继承的成员的新实现。由重写声明重写的方法称为重写基方法。重写基方法必须与重写方法具有相同的签名。
不能重写非虚方法或静态方法。重写基方法必须是虚拟的、抽象的或重写的。其中抽象方法是必须覆写的。
也就是说,用 override 修饰符重写的基类中的方法必须是 virtual, abstract 或 override 方法。
要求:相同的方法名称;相同的参数列表;相同的返回类型。
3.overwrite (重写)关键字:new
A.overwrite不是C#的关键字;
B.重写时使用的关键字是new;
C.重写的方法,方法签名必须相同(方法名相同+参数列表不同+返回类型不做区分);
D.new关键字重写,就像父类里不存在这些方法一样.
E.如果子类中方法的签名和父类中相同,但是没有加new或者override关键字,此时编译器会发出警告.
"子类方法"隐藏了继承的成员"父类方法", 如果是有意隐藏,请使用关键字 new.
F.如果父类中没有该方法,却加了new关键字,编译器也会发出警告:
成员“子类方法”不会隐藏继承的成员。不需要关键字 new


1 public class A 2 { 3 public void MethodF() 4 { 5 Console.WriteLine("A.F"); 6 } 7 public virtual void MethodG() 8 { 9 Console.WriteLine("A.G"); 10 } 11 } 12 public class B : A 13 { 14 new public void MethodF() 15 { 16 Console.WriteLine("B.F"); 17 } 18 public override void MethodG() 19 { 20 Console.WriteLine("B.G"); 21 } 22 } 23 class Test 24 { 25 static void Main() 26 { 27 B b; 28 b = new B(); 29 A a = b; 30 a.MethodF();//A.F 31 b.MethodF();//B.F 32 a.MethodG();//B.G 33 b.MethodG();//B.G 34 } 35 }
如果子类没有重载(沒使用override关键字)而有和父类完全一樣的方法,如下代码:


1 class A{ 2 public virtual void MA(string s) 3 {Console.WriteLine("class A:" + s);} 4 public virtual void MA(int i) 5 {Console.WriteLine("class A:" + i.ToString());} 6 } 7 8 class B:A{ 9 public override void MA(string s) //完全取代父类代码 10 {Console.WriteLine("class B:" + s);} 11 public new void MA(int i) //暂时隐藏父类代码 12 {Console.WriteLine("class B:" + i.ToString());} 13 } 14 15 void Main(){ 16 B b=new B(); 17 A a=(B)b; //convert B-->A 18 a.MA("li"); 19 a.MA(100);} 20 21 output: 22 class B:li 23 class A:100