C#之virtual override new解析
温故而知新,是智也。
virtual允许派生类重写该方法。默认情况下方法是非虚的,不允许重写。
override重写基类具有相同签名的方法,不可重写非虚方法和静态方法,对应基类同名方法的关键字是virtual、abstract。
new常用于:作为运算符,创建对象及调用构造函数;作为修饰符,隐藏基类具有相同签名的方法;用于泛型约束,约束参数类型。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace ConsoleApplication 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 MyChild mychild = new MyChild(); 14 MyBase mybase1 = new MyBase(); 15 MyBase mybase2 = mychild; 16 17 mybase1.Say(); //MyBase.Say 18 mybase2.Say(); //MyBase.Say 19 mychild.Say(); //MyChild.Say 20 21 mybase1.Speak(); //MyBase.Speak 22 mybase2.Speak(); //MyChild.Speak,注意这里不是MyBase.Speak 23 mychild.Speak(); //MyChild.Speak 24 25 mybase1.Talk(); //MyBase.Talk 26 mybase2.Talk(); //MyBase.Talk 27 mychild.Talk(); //MyChild.Talk 28 29 mybase1.Tell(); //MyBase.Tell 30 mybase2.Tell(); //MyBase.Tell 31 mychild.Tell(); //MyChild.Tell 32 33 Console.ReadKey(); 34 } 35 } 36 37 class MyBase 38 { 39 public virtual void Say() { Console.WriteLine("MyBase.Say"); } 40 public virtual void Speak() { Console.WriteLine("MyBase.Speak"); } 41 public virtual void Talk() { Console.WriteLine("MyBase.Talk"); } 42 public void Tell() { Console.WriteLine("MyBase.Tell"); } 43 } 44 class MyChild : MyBase 45 { 46 public new void Say() { Console.WriteLine("MyChild.Say"); } //new修饰符显式隐藏基类方法 47 public override void Speak() { Console.WriteLine("MyChild.Speak"); } //override修饰符重写基类方法 48 public void Talk() { Console.WriteLine("MyChild.Talk"); } //隐式隐藏基类方法 49 public void Tell() { Console.WriteLine("MyChild.Tell"); } //隐式隐藏基类方法 50 } 51 }