NGWS SDK Documentation  

This is preliminary documentation and subject to change.
To comment on this topic, please send us email at ngwssdk@microsoft.com. Thanks!

virtual

The virtual keyword is used to modify a method or property declaration, in which case the method or the property is called a virtual member. The implementation of a virtual member can be changed by an overriding member in a derived class.

When a virtual method is invoked, the runtime type of the object is checked for an overriding member. The overriding member in the most derived class is called, which might be the original member, if no derived class has overridden the member. For more information, see runtime type and most derived implementation in the Language Reference.

By default, methods are non-virtual.

You cannot use the virtual modifier with the following modifiers:

static   abstract   override

Virtual properties behave like abstract methods, except for the differences in declaration and invocation syntax.

For more information on virtual methods, see Virtual Methods in the Language Reference.

Example

In this example, the class Dimensions contains the two coordinates x, y, and the Area() virtual method. Different shape classes such as Circle, Cylinder, and Sphere inherit the Dimensions class, and the surface area is calculated for each figure. Each derived class has it own override implementation of Area(). The program calculates and displays the proper area for each figure by invoking the proper implementation of Area() according to the object associated with the method.

// Virtual and override
using System;
class TestClass {
   public class Dimensions {
      public const double pi = Math.PI;
      protected double x, y;
      public Dimensions() {}
      public Dimensions (double x, double y) {
         this.x = x;
         this.y = y;
      }
      public virtual double Area() { 
         return x*y;
      }
   }
   public class Circle: Dimensions {
      public Circle(double r): base(r, 0) {}
      public override double Area() { return pi * x * x; }
   }
   class Sphere: Dimensions {
      public Sphere(double r): base(r, 0) {}
         public override double Area() { return 4 * pi * x * x; }
   }
   class Cylinder: Dimensions {
      public Cylinder(double r, double h): base(r, h) {}
      public override double Area() { return 2*pi*x*x + 2*pi*x*y; }
   }
   public static void Main()  {
      double r = 3.0, h = 5.0;
      Dimensions c = new Circle(r);
      Dimensions s = new Sphere(r);
      Dimensions l = new Cylinder(r, h);
      // Display results:
      Console.WriteLine("Area of Circle   = {0}", 
               double.Format(c.Area(), "0.00"));
      Console.WriteLine("Area of Sphere   = {0}", 
               double.Format(s.Area(), "0.00"));
      Console.WriteLine("Area of Cylinder = {0}", 
               double.Format(l.Area(), "0.00"));   
   }
}

Output

Area of Circle   = 28.27
Area of Sphere   = 113.10
Area of Cylinder = 150.80

In the preceding example, notice that the inherited classes Circle, Sphere, and Cylinder are all using constructors that initialize the base class, for example:

public Cylinder(double r, double h): base(r, h) {}

This is analogous to the C++ initialization list.

See Also

abstract | override | C# Keywords | Modifiers