C# overload、override、hiding区别
overload(重载)表示在同一个作用域中有多个名称相同但签名不同的方法。
1 class DoThings 2 { 3 public string DoThingsManyWays(int num) 4 { 5 return "I'm overloading number things."; 6 } 7 8 public string DoThingsManyWays(string str) 9 { 10 return "I'm overloading string things."; 11 } 12 }
override(重写)表示在子类中重写方法的实现,父类中必须声明为virtual。
1 class Parent 2 { 3 public virtual string DoThings() 4 { 5 return "I'm parent class virtual method."; 6 } 7 } 8 9 class Child : Parent 10 { 11 public override string DoThings() 12 { 13 return "I'm child class override method."; 14 } 15 }
子类可以使用hiding修改父类方法的行为,但new将被父类中由virtual修饰的同名方法所覆盖。
1 class Parent 2 { 3 public string Do() 4 { 5 return "I'm Parent.Do."; 6 } 7 } 8 9 class Child : Parent 10 { 11 new public string Do() 12 { 13 return "I'm Child.Do."; 14 } 15 }
输出结果:
1 Parent parent = new Parent(); 2 Child child = new Child(); 3 4 Console.WriteLine(child.DoThings()); 5 // I'm child class override method. 6 7 Console.WriteLine((child as Parent).DoThings()); 8 // I'm child class override method. 9 10 Console.WriteLine(parent.Do()); 11 // I'm Parent.Do. 12 13 Console.WriteLine(child.Do()); 14 // I'm Child.Do. 15 16 Console.WriteLine((child as Parent).Do()); 17 // I'm Parent.Do.
程序代码见:https://github.com/meantobe/blog/tree/master/CSharp/OverrideAndOverload
参考资料:
1. http://stackoverflow.com/questions/673721/overloading-and-overriding/673754
2. http://www.hanselman.com/blog/WhatGreatNETDevelopersOughtToKnowMoreNETInterviewQuestions.aspx
3. http://www.cnblogs.com/lipu/archive/2010/11/12/1875095.html