virtual (Справочник по C#)

Обновлен: Ноябрь 2007

Ключевое слово virtual используется для изменения объявлений методов, свойств, индексаторов и событий и разрешения их переопределения в производном классе. Например, этот метод может быть переопределен любым производным классом:

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

Реализацию виртуального члена можно изменить путем переопределения члена в производном классе. Дополнительные сведения об использовании ключевого слова virtual см. в разделах Практическое руководство. Управление версиями с помощью ключевых слов "Override" и "New" (Руководство по программированию в C#) и Использование ключевых слов "Override" и "New" (Руководство по программированию в C#).

Заметки

При вызове виртуального метода тип времени выполнения объекта проверяется на переопределение члена. Вызывается переопределение члена в самом дальнем классе. Это может быть исходный член, если никакой производный класс не выполнял переопределение этого члена.

По умолчанию методы не являются виртуальными. Такой метод нельзя переопределить.

Модификатор virtual нельзя использовать с модификаторами static, abstract, private или override.

Действие виртуальных свойств аналогично абстрактным методам, за исключением отличий в синтаксисе объявлений и вызовов.

  • Использование модификатора virtual в статическом свойстве является недопустимым.

  • Виртуальное наследуемое свойство может быть переопределено в производном классе путем включения объявления свойства, которое использует модификатор override.

Пример

В этом примере класс Dimensions содержит две координаты x, y и виртуальный метод Area(). Различные классы фигур, такие как Circle, Cylinder и Sphere, наследуют класс Dimensions, и для каждой фигуры вычисляется площадь поверхности. Каждый производный класс обладает собственной реализацией переопределения метода Area(). Программа вычисляет и отображает соответствующую площадь для каждой фигуры путем вызова нужной реализации метода Area() в соответствии с объектом, связанным с этим методом.

Обратите внимание: наследуемые классы Circle, Sphere и Cylinder используют конструкторы, которые инициируют основной класс, например:

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

Этот подход аналогичен списку инициализации C++.

class TestClass
{
    public class Dimensions
    {
        public const double PI = Math.PI;
        protected double x, y;
        public Dimensions()
        {
        }
        public Dimensions(double x, double y)
        {
            this.x = x;
            this.y = y;
        }

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

    public class Circle : Dimensions
    {
        public Circle(double r) : base(r, 0)
        {
        }

        public override double Area()
        {
            return PI * x * x;
        }
    }

    class Sphere : Dimensions
    {
        public Sphere(double r) : base(r, 0)
        {
        }

        public override double Area()
        {
            return 4 * PI * x * x;
        }
    }

    class Cylinder : Dimensions
    {
        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;
        Dimensions c = new Circle(r);
        Dimensions s = new Sphere(r);
        Dimensions 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#

Дополнительные сведения см. в следующих разделах документа Спецификация языка C#:

  • 1.6.6.4 Виртуальные, абстрактные методы и методы переопределения

  • 10.6.3 Виртуальные методы

  • 10.7.5 Виртуальные, запечатанные, абстрактные методы доступа и методы доступа переопределения

См. также

Основные понятия

Руководство по программированию в C#

Ссылки

Модификаторы (Справочник по C#)

Ключевые слова C#

Полиморфизм (руководство по программированию в C#)

abstract (Справочник по C#)

override (справочник по C#)

new (справочник по C#)

Другие ресурсы

Справочник по C#