virtual (C# Başvurusu)

virtual anahtar 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 onu 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 üye tarafından değiştirilebilir. Anahtar sözcüğün virtual nasıl kullanılacağı 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ılmave 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ılma üyesi çağrılır, bu özgün üye olabilir, türetilmiş hiçbir sınıf üye geçersiz kılmadıysa.

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 dahil edilerek türetilmiş bir sınıfta geçersiz kılınabilir.

Örnek

Bu örnekte, Shape sınıfı , ve sanal yönteminin iki koordinatını yxArea() içerir. , CylinderSphere ve gibi Circlefarklı şekil sınıfları sınıfını 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 sınıflar Circle, Sphereve Cylinder tüm aş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.