Sdílet prostřednictvím


virtual (Referenční dokumentace jazyka C#)

virtual Klíčové slovo lze změnit metodu, vlastnost, indexovací člen nebo událost prohlášení a umožnit, aby v odvozené třídě.Tuto metodu lze například přepsat libovolné třídy, která dědí jeho:

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

Provádění virtuální člen může změnit potlačení členské v odvozené třídě.Další informace o použití virtual klíčové slovo, viz Správa verzí pomocí klíčových slov override a new (Průvodce programováním v C#) a Znalost, kdy použít klíčová slova override a new (Průvodce programováním v C#).

Poznámky

Při virtuální metody, typ spuštění objektu zaškrtnuto pro převažující člena.Člen převažující většina odvozené třídy se nazývá, což může být původní členské žádné odvozené třídy byl přepsán, člen.

Standardně jsou bez virtuální metody.Virtuální metodu nelze přepsat.

Nelze použít virtual modifikátor s static, abstract, private, nebo override modifikátory.Následující příklad zobrazí virtuální vlastnosti:

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

}

Vlastnosti virtuálního chovat jako abstraktní metody s výjimkou rozdíly v syntaxi prohlášení a vyvolání.

  • Je při použití virtual modifikátor v statickou vlastnost.

  • Virtuální zděděná vlastnost lze přepsat v odvozené třídě včetně deklarace vlastnosti, které používá override modifikátor.

Příklad

V tomto příkladu Shape třída obsahuje dvě souřadnice x, ya Area() virtuální metody.Jiný obrazec, jako například třídy Circle, Cylinder, a Sphere dědí Shape třídy a plochy se vypočítá pro každý obrázek.Odvozené třídy má vlastní implementaci přepsat Area().

Všimněte si, že zděděné třídy Circle, Sphere, a Cylinder používat konstruktory, které inicializovat základní třídy, jak je znázorněno v následující prohlášení.

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

Následující program vypočítá a zobrazí oblasti vhodné pro každý obrázek vyvoláním provedení Area() metody podle objektu, který je spojen s metodou.

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
    */

Specifikace jazyka C#

Další informace najdete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.

Viz také

Referenční dokumentace

Modifikátory (Referenční dokumentace jazyka C#)

Klíčová slova jazyka C#

Polymorfismus (Průvodce programováním v C#)

abstract (Referenční dokumentace jazyka C#)

override (Referenční dokumentace jazyka C#)

new (Referenční dokumentace jazyka C#)

Koncepty

Průvodce programováním v C#

Další zdroje

Referenční dokumentace jazyka C#