virtual关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。这提供了一种使派生类可以包含与基类方法同名的方法的机制。
使用virtual有以下几个要点: 1、基类方法必须定义为virtual。 2、如果派生类中的方法前面带有new关键字,则该方法被定义为独立于基类中的方法(也就是说与基类中的同名方法共存,但是基类的方法被隐藏了)。 3、如果派生类中的方法前面带有override关键字,则派生类中的方法是对基类中的方法进行覆盖。 4、如果派生类中的方法前面没有new或override,则默认是new,编译器会发出警告。 5、可以在派生类中使用base关键字来访问基类中的方法。 6、以上几条对属性、索引器和事件也适用。当在类中指定方法时,如果有多个方法与调用兼容(例如,存在两种同名的方法,并且其参数与传递的参数兼容),则 C# 编译器将选择最佳方法进行调用。
示例: class Sharp { public virtual void area(int x, int y) { System.Console.WriteLine("Sharp.area():{0:F2}", x * y); } }
class Rect : Sharp{ public new void area(int x, int y) { System.Console.WriteLine("Rect.area():int:{0:F2}", x * y); } public void area(double x, double y) { System.Console.WriteLine("Rect.area():double:{0:F2}", x * y); }} class Circle : Sharp{ private static double PI = Math.PI; public override void area(int x, int y) { System.Console.WriteLine("Circle.area():overide{0:F2}", PI * x * x); } public void area(double x, double y) { System.Console.WriteLine("Circle.area():double:{0}", PI * x * x); }} class TestSuite{ public static void Test() { Rect c1 = new Rect(); c1.area(1, 2); c1.area(1.1, 2.2); ((Sharp)c1).area(1, 2); Circle c2 = new Circle(); c2.area(1, 2); ((Sharp)c2).area(2, 2); System.Console.ReadLine(); }}执行结果: Rect.area():int:2.00 Rect.area():double:2.42 Sharp.area():2.00 Circle.area():double:3.14159265358979 Circle.area():overide12.57
参考: virtual(C# 参考) 使用 Override 和 New 关键字进行版本控制(C# 编程指南) 了解何时使用 Override 和 New 关键字(C# 编程指南)
