virtual (Справочник по C#)
Ключевое слово virtual используется для изменения объявлений методов, свойств, индексаторов и событий и разрешения их переопределения в производном классе. Например, этот метод может быть переопределен любым производным классом:
public virtual double Area()
{
return x * y;
}
Реализацию виртуального члена можно изменить путем переопределения члена в производном классе. Дополнительные сведения об использовании ключевого слова virtual см. в разделах Практическое руководство. Управление версиями с помощью ключевых слов "Override" и "New" (Руководство по программированию в C#) и Использование ключевых слов "Override" и "New" (Руководство по программированию в C#).
Заметки
При вызове виртуального метода тип времени выполнения объекта проверяется на переопределение члена. Вызывается переопределение члена в самом дальнем классе. Это может быть исходный член, если никакой производный класс не выполнял переопределение этого члена.
По умолчанию методы не являются виртуальными. Такой метод нельзя переопределить.
Модификатор virtual нельзя использовать с модификаторами static, abstract, private или override. В следующем примере показано виртуальное свойство.
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";
}
}
}
}
Действие виртуальных свойств аналогично абстрактным методам, за исключением отличий в синтаксисе объявлений и вызовов.
Использование модификатора 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#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.
См. также
Ссылки
Модификаторы (Справочник по C#)
Полиморфизм (Руководство по программированию на C#)
Основные понятия
Руководство по программированию на C#