virtual (C# Başvurusu)virtual (C# Reference)

virtual Anahtar sözcüğü, bir yöntemi, özelliği, dizin oluşturucu veya olay bildirimini değiştirmek ve türetilen bir sınıfta geçersiz kılınması için izin vermek için kullanılır.The virtual keyword is used to modify a method, property, indexer, or event declaration and allow for it to be overridden in a derived class. Örneğin, bu yöntem devraldığı herhangi bir sınıf tarafından geçersiz kılınabilir:For example, this method can be overridden by any class that inherits it:

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

Uygulamasını bir sanal üye tarafından değiştirilebilen bir geçersiz kılan üye türetilen bir sınıfta.The implementation of a virtual member can be changed by an overriding member in a derived class. Nasıl kullanılacağı hakkında daha fazla bilgi için virtual anahtar sözcüğü, bkz: geçersiz kılma ve yeni anahtar sözcüklerle sürüm oluşturma ve bilerek, geçersiz kılma kullanın ve yeni anahtar sözcüklerle.For more information about how to use the virtual keyword, see Versioning with the Override and New Keywords and Knowing When to Use Override and New Keywords.

AçıklamalarRemarks

Sanal bir yöntem çağrıldığında, nesnenin çalışma zamanı türü için geçersiz kılan bir üye denetlenir.When a virtual method is invoked, the run-time type of the object is checked for an overriding member. Türetilmiş sınıf üyesi kıldıysa, özgün üyesi olabilir. en çok türetilen bir sınıfta geçersiz kılan üye çağrılır.The overriding member in the most derived class is called, which might be the original member, if no derived class has overridden the member.

Varsayılan olarak, sanal olmayan yöntemlerdir.By default, methods are non-virtual. Sanal olmayan bir yöntemi geçersiz kılınamıyor.You cannot override a non-virtual method.

Kullanamazsınız virtual değiştiriciyle static, abstract, private, veya override değiştiriciler.You cannot use the virtual modifier with the static, abstract, private, or override modifiers. Aşağıdaki örnek, sanal bir özellik gösterilmiştir:The following example shows a virtual property:

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 (!string.IsNullOrEmpty(value))
            {
                name = value;
            }
            else
            {
                name = "Unknown";
            }
        }
    } 
}

Sanal özellikler, bildirim ve çağırma söz dizimi farklılıkları dışında soyut yöntemler gibi davranır.Virtual properties behave like abstract methods, except for the differences in declaration and invocation syntax.

  • Kullanılacak bir hata olduğunu virtual değiştirici statik bir özellik.It is an error to use the virtual modifier on a static property.

  • Sanal bir devralınan özelliği kullanan bir özellik bildirimi dahil olmak üzere türetilen bir sınıfta kılınabilir override değiştiricisi.A virtual inherited property can be overridden in a derived class by including a property declaration that uses the override modifier.

ÖrnekExample

Bu örnekte, Shape sınıfı içeren iki koordinat x, yve Area() sanal yöntem.In this example, the Shape class contains the two coordinates x, y, and the Area() virtual method. Farklı şekil sınıflar gibi Circle, Cylinder, ve Sphere devral Shape sınıfı ve yüzey her şekil için hesaplanır.Different shape classes such as Circle, Cylinder, and Sphere inherit the Shape class, and the surface area is calculated for each figure. Her bir türetilmiş sınıf kendi geçersiz kılma uygulaması olan Area().Each derived class has its own override implementation of Area().

Dikkat devralınan sınıflar Circle, Sphere, ve Cylinder tüm taban sınıf başlatma oluşturucular aşağıdaki bildirimde gösterildiği gibi kullanın.Notice that the inherited classes Circle, Sphere, and Cylinder all use constructors that initialize the base class, as shown in the following declaration.

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

Aşağıdaki program hesaplar ve her bir şekil için uygun alan uygun uygulama çağırarak görüntüler Area() yöntemiyle ilişkili nesne göre yöntemi.The following program calculates and displays the appropriate area for each figure by invoking the appropriate implementation of the Area() 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)
        {
            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
*/

C# dili belirtimiC# language specification

Daha fazla bilgi edinmek için, bkz. C# Dil Belirtimi.For more information, see the C# Language Specification. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.The language specification is the definitive source for C# syntax and usage.

Ayrıca bkz.See also