Movatterモバイル変換


[0]ホーム

URL:


Skip to main content

This browser is no longer supported.

Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.

Download Microsoft EdgeMore info about Internet Explorer and Microsoft Edge
Table of contentsExit focus mode

virtual (C# Reference)

  • 2024-10-08
Feedback

In this article

Thevirtual keyword is used to modify a method, property, indexer, or event declaration and allow for it to be overridden in a derived class. For example, this method can be overridden by any class that inherits it:

public virtual double Area(){    return x * y;}

The implementation of a virtual member can be changed by anoverriding member in a derived class. For more information about how to use thevirtual keyword, seeVersioning with the Override and New Keywords andKnowing When to Use Override and New Keywords.

Remarks

When a virtual method is invoked, the run-time 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.

By default, methods are non-virtual. You cannot override a non-virtual method.

The following example shows a virtual property:

class MyBaseClass{    // virtual automatically 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 automatically implemented property with ordinary property    // to provide specialized accessor behavior.    public override string Name    {        get        {            return _name;        }        set        {            if (!string.IsNullOrEmpty(value))            {                _name = value;            }            else            {                _name = "Unknown";            }        }    }}

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

  • A virtual inherited property can be overridden in a derived class by including a property declaration that uses theoverride modifier.

Example

In this example, theShape class contains the two coordinatesx,y, and theArea() virtual method. Different shape classes such asCircle,Cylinder, andSphere inherit theShape class, and the surface area is calculated for each figure. Each derived class has its own override implementation ofArea().

Notice that the inherited classesCircle,Cylinder, andSphere all use constructors that initialize the base class, as shown in the following declaration.

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

The following program calculates and displays the appropriate area for each figure by invoking the appropriate implementation of theArea() method, according to the object that is associated with the method.

class TestClass{    public class Shape    {        public const double PI = Math.PI;        protected double _x, _y;        public Shape()        {        }        public Shape(double x, double y)        {            _x = x;            _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;        }    }    public class Sphere : Shape    {        public Sphere(double r) : base(r, 0)        {        }        public override double Area()        {            return 4 * PI * _x * _x;        }    }    public 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   = {c.Area():F2}");        Console.WriteLine($"Area of Sphere   = {s.Area():F2}");        Console.WriteLine($"Area of Cylinder = {l.Area():F2}");    }}/*Output:Area of Circle   = 28.27Area of Sphere   = 113.10Area of Cylinder = 150.80*/

C# language specification

For more information, see theC# Language Specification. The language specification is the definitive source for C# syntax and usage.

See also

Collaborate with us on GitHub
The source for this content can be found on GitHub, where you can also create and review issues and pull requests. For more information, seeour contributor guide.

Feedback

Was this page helpful?

YesNo

In this article

Was this page helpful?

YesNo