virtual 关键字用于修改方法或属性的声明,在这种情况下,方法或属性被称作虚拟成员。虚拟成员的实现可由派生类中的重写成员更改。 调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。(有关运行时类型和大部分派生实现的更多信息,请参见 10.5.3 虚拟方法。) 默认情况下,方法是非虚拟的。不能重写非虚方法。 不能将 virtual 修饰符与以下修饰符一起使用: static abstract override 除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。
有关虚方法的更多信息,请参见 10.5.3 虚拟方法。 在该示例中,
1
![]() 2 ![]() 3 ![]() 4 ![]() 5 { 6 public class Dimensions 7 { 8 public const double pi = Math.PI; 9 protected double x, y; 10 public Dimensions() 11 { 12 } 13 public Dimensions (double x, double y) 14 { 15 this.x = x; 16 this.y = y; 17 } 18 19 public virtual double Area() 20 { 21 return x*y; 22 } 23 } 24 25 public class Circle: Dimensions 26 { 27 public Circle(double r): base(r, 0) 28 { 29 } 30 31 public override double Area() 32 { 33 return pi * x * x; 34 } 35 } 36 37 class Sphere: Dimensions 38 { 39 public Sphere(double r): base(r, 0) 40 { 41 } 42 43 public override double Area() 44 { 45 return 4 * pi * x * x; 46 } 47 } 48 49 class Cylinder: Dimensions 50 { 51 public Cylinder(double r, double h): base(r, h) 52 { 53 } 54 55 public override double Area() 56 { 57 return 2*pi*x*x + 2*pi*x*y; 58 } 59 } 60 61 public static void Main() 62 { 63 double r = 3.0, h = 5.0; 64 Dimensions c = new Circle(r); 65 Dimensions s = new Sphere(r); 66 Dimensions l = new Cylinder(r, h); 67 // Display results: 68 Console.WriteLine("Area of Circle = {0:F2}", c.Area()); 69 Console.WriteLine("Area of Sphere = {0:F2}", s.Area()); 70 Console.WriteLine("Area of Cylinder = {0:F2}", l.Area()); 71 } 72}
输出Area of Circle = 28.27 Area of Sphere = 113.10 Area of Cylinder = 150.80 在前面的示例中,注意继承的类 public Cylinder(double r, double h): base(r, h) {} 这类似于 C++ 的初始化列表。 |
virtual 关键字
最新推荐文章于 2024-06-04 20:47:42 发布