virtual(C# )
调用虚方法时,将为重写成员检查该对象的运行时类型。 将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。
默认情况下,方法是非虚拟的。 不能重写非虚方法。
virtual
修饰符不能与 static
、abstract, private
或 override
修饰符一起使用。 下面的示例演示一个虚拟属性:
class MyBaseClass { // virtual auto-implemented property. Overrides can only // provide specialized behavior if they implement get and set accessors. public virtual string Name { get; set; } // ordinary virtual property with backing field private int num; public virtual int Number { get { return num; } set { num = value; } } } class MyDerivedClass : MyBaseClass { private string name; // Override auto-implemented property with ordinary property // to provide specialized accessor behavior. public override string Name { get { return name; } set { if (value != String.Empty) { name = value; } else { name = "Unknown"; } } } }
除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。
-
在静态属性上使用
virtual
修饰符是错误的。 -
通过包括使用
override
修饰符的属性声明,可在派生类中重写虚拟继承属性。
在该示例中,Shape
类包含 x
、y
两个坐标和 Area()
虚方法。 不同的形状类,如 Circle
、Cylinder
和 Sphere
继承 Shape
类,并为每个图形计算表面积。 每个派生类都有各自的 Area()
重写实现。
通知继承的类 Circle
、 Sphere
和 Cylinder
初始化基类的所有使用构造函数,如以下声明所示。
public Cylinder(double r, double h): base(r, h) {}
下面的过程通过调用 Area()
方法的适当实现计算并显示由每个图形的合适区域,根据与该方法的对象。
class TestClass { public class Shape { public const double PI = Math.PI; protected double x, y; public Shape() { } public Shape(double x, double y) { this.x = x; this.y = y; } public virtual double Area() { return x * y; } } public class Circle : Shape { public Circle(double r) : base(r, 0) { } public override double Area() { return PI * x * x; } } class Sphere : Shape { public Sphere(double r) : base(r, 0) { } public override double Area() { return 4 * PI * x * x; } } class Cylinder : Shape { public Cylinder(double r, double h) : base(r, h) { } public override double Area() { return 2 * PI * x * x + 2 * PI * x * y; } } static void Main() { double r = 3.0, h = 5.0; Shape c = new Circle(r); Shape s = new Sphere(r); Shape l = new Cylinder(r, h); // Display results: Console.WriteLine("Area of Circle = {0:F2}", c.Area()); Console.WriteLine("Area of Sphere = {0:F2}", s.Area()); Console.WriteLine("Area of Cylinder = {0:F2}", l.Area()); } } /* Output: Area of Circle = 28.27 Area of Sphere = 113.10 Area of Cylinder = 150.80 */