virtual (C# Başvurusu)

virtualAnahtar sözcüğü bir yöntemi, özelliği, Dizin Oluşturucuyu veya olay bildirimini değiştirmek ve bir türetilmiş 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;
}

Bir sanal üyenin uygulanması türetilmiş bir sınıftaki geçersiz kılan bir üye tarafından değiştirilebilir. Anahtar sözcüğünü kullanma hakkında daha fazla bilgi için virtual , 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ı bilme.

Açıklamalar

Bir sanal yöntem çağrıldığında, nesnenin çalışma zamanı türü geçersiz kılan üye için denetlenir. Türetilmiş bir sınıf üye tarafından geçersiz kılınmamışsa, en çok türetilen sınıftaki geçersiz kılan üye çağrılır, bu, özgün üye olabilir.

Varsayılan olarak, metotlar sanal değildir. Sanal olmayan bir yöntemi geçersiz kılamazsınız.

Değiştirici,,, virtual static abstract private veya override değiştiriciyle kullanılamaz. Aşağıdaki örnek bir sanal özelliği gösterir:

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 sanal yöntemler gibi davranır.

  • virtualDeğiştirici statik bir özellik üzerinde kullanılması hatadır.

  • Değiştirici kullanan bir özellik bildirimi eklenerek, türetilmiş bir sınıfta sanal devralınmış bir özellik geçersiz kılınabilir override .

Örnek

Bu örnekte, Shape sınıfı iki koordinat, x y ve Area() sanal yöntemi içerir. ,, Ve gibi farklı şekil sınıfları Circle Cylinder Sphere Shape ve yüzey alanı her bir şekil için hesaplanır. Türetilmiş her sınıf kendi geçersiz kılma uygulamasına sahiptir Area() .

Devralınan sınıfların Circle , Sphere ve Cylinder tümünün, aşağıdaki bildirimde gösterildiği gibi, temel sınıfı başlatacak olan oluşturuculara sahip olduğuna dikkat edin.

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

Aşağıdaki program, yöntemiyle Area() ilişkili nesneye göre yönteminin uygun uygulamasını çağırarak her bir ş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.