Sdílet prostřednictvím


virtual (Referenční dokumentace jazyka C#)

Klíčové virtual slovo se používá k úpravě metody, vlastnosti, indexeru nebo deklarace události a umožňuje jeho přepsání v odvozené třídě. Tuto metodu lze například přepsat libovolnou třídou, která ji dědí:

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

Implementace virtuálního členu může být změněna přepsáním člena v odvozené třídě. Další informace o tom, jak používat virtual klíčové slovo, naleznete v tématu Správa verzí s přepsáním a novými klíčovými slovy a znalost, kdy použít přepsání a nová klíčová slova.

Poznámky

Při vyvolání virtuální metody se kontroluje typ běhu objektu pro přepsání člena. Přepsání členu v nejvíce odvozené třídě je volána, což může být původní člen, pokud žádná odvozená třída nepřepsala člen.

Ve výchozím nastavení jsou metody ne virtuální. Nelze přepsat ne virtuální metodu.

Následující příklad ukazuje virtuální vlastnost:

class MyBaseClass
{
    // virtual automatically 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 automatically 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";
            }
        }
    }
}

Virtuální vlastnosti se chovají jako virtuální metody s výjimkou rozdílů v deklaraci a syntaxi vyvolání.

  • Virtuální zděděná vlastnost lze přepsat v odvozené třídě zahrnutím 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í metoda. Různé třídy obrazců, jako Circleje , Cylindera Sphere dědí Shape třídu a povrchová oblast se vypočítá pro každý obrázek. Každá odvozená třída má vlastní přepsání Area()implementace .

Všimněte si, že zděděné třídy Circle, Cylindera Sphere všechny use konstruktory, které inicializují základní třídu, jak je znázorněno v následující deklaraci.

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

Následující program vypočítá a zobrazí odpovídající oblast pro každý obrázek vyvoláním příslušné implementace Area() metody podle objektu, který je přidružen k metodě.

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

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é