virtual (C# Başvurusu)

anahtar virtual sözcüğü bir yöntemi, özelliği, dizin oluşturucuyu veya olay bildirimini değiştirmek ve türetilmiş bir sınıfta geçersiz kılınmasına izin vermek için kullanılır. Örneğin, bu yöntem devralan herhangi bir sınıf tarafından geçersiz kılınabilir:

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

Sanal üyenin uygulaması, türetilmiş bir sınıfta geçersiz kılınan bir üye tarafından değiştirilebilir. anahtar sözcüğünü virtual kullanma hakkında daha fazla bilgi için bkz. Geçersiz Kılma ve Yeni Anahtar Sözcüklerle Sürüm Oluşturma ve Geçersiz Kılma ve Yeni Anahtar Sözcüklerin Ne Zaman Kullanılacağını Bilmek.

Açıklamalar

Bir sanal yöntem çağrıldığında, nesnenin çalışma zamanı türü geçersiz kılınan üye için denetleniyor. En türetilmiş sınıfta geçersiz kılınan üye çağrılır. Bu, türetilmiş hiçbir sınıf üyeyi geçersiz kılmadıysa özgün üye olabilir.

Varsayılan olarak yöntemler sanal olmayan yöntemlerdir. Sanal olmayan bir yöntemi geçersiz kılamazsınız.

Değiştiriciyi virtual , , abstractprivateveya override değiştiricileriyle statickullanamazsınız. Aşağıdaki örnekte bir sanal özellik gösterilmektedir:

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 dizimindeki farklar dışında sanal yöntemler gibi davranır.

  • Değiştiriciyi virtual statik bir özellikte kullanmak bir hatadır.

  • Sanal devralınan özellik, değiştiriciyi kullanan override bir özellik bildirimi eklenerek türetilmiş bir sınıfta geçersiz kılınabilir.

Örnek

Bu örnekte, Shape sınıfı , yve sanal yönteminin iki koordinatını xArea() içerir. , ve gibi CircleCylinderSphere farklı şekil sınıfları sınıfı devralır Shape ve yüzey alanı her şekil için hesaplanır. Türetilen her sınıfın kendi geçersiz kılma uygulaması vardır Area().

Devralınan , Cylinderve Sphere tüm sınıflarının Circleaşağıdaki bildirimde gösterildiği gibi temel sınıfı başlatan oluşturucuları kullandığına dikkat edin.

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

Aşağıdaki program, yöntemiyle ilişkili nesneye göre yöntemin uygun uygulamasını Area() çağırarak her şekil için uygun alanı hesaplar ve görüntüler.

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   = {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 belirtimi

Daha fazla bilgi edinmek için, bkz. C# Dil Belirtimi. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.

Ayrıca bkz.