Виртуальные методы в C# позволяют переопределять методы базового класса в классах-наследниках, добавляя или изменяя их функциональность. Переопределение – механизм модификации метода родительского класса в классе-наследнике.
Виртуальный метод
Виртуальный метод – метод, переопределяемый в классах-наследниках. Например, метод print в базовом классе выводит только имя объекта. В классе-наследнике его можно переопределить для вывода имени и дополнительных данных, например, скорости.
Создание виртуального метода
Для создания виртуального метода используется модификатор virtual в объявлении метода базового класса:
public virtual void Print() { ... }
public virtual void указывает, что метод Print общедоступный, виртуальный и не возвращает значения (тип void).
Переопределение виртуальных методов возможно только в контексте наследования. Метод, объявленный как виртуальный в базовом классе, доступен для переопределения только в классах, наследующих этот базовый класс.
Переопределение виртуального метода
Для переопределения виртуального метода в классе-наследнике используется ключевое слово override:
public override void Print() { ... }
В переопределенном методе можно использовать base.Print() для вызова базовой реализации. Это позволяет сохранить функциональность базового метода и добавить новые возможности. Например:
public override void Print()
{
base.Print(); // Вызов базового метода
Console.WriteLine($"Скорость: {Speed}");
}
Здесь base.Print() вызывает базовую реализацию Print, после чего выводится скорость. Без base.Print() выводилась бы только скорость, а не имя объекта, как в базовом классе.
Использование base.Print() – распространенный подход к расширению, а не полной замене функциональности базового метода. Переопределение часто применяется для добавления небольшого количества кода к существующей функциональности, избегая дублирования кода.
Пример: Animal, Dog, Cat
Рассмотрим базовый класс Animal и классы-наследники Dog и Cat. В Animal объявлен виртуальный метод Print(). В Dog и Cat этот метод переопределен для вывода специфичной информации:
// Базовый класс
public class Animal
{
public string Name { get; set; }
public virtual void Print()
{
Console.WriteLine($"Имя: {Name}");
}
}
// Класс-наследник
public class Dog : Animal
{
public int Speed { get; set; }
public override void Print()
{
base.Print();
Console.WriteLine($"Скорость: {Speed}");
}
}
// Класс-наследник
public class Cat : Animal
{
public int Speed { get; set; }
public override void Print()
{
base.Print();
Console.WriteLine($"Скорость: {Speed}");
}
}
Вызов Print() для объектов Dog и Cat выведет имя и скорость.
Виртуальные методы и их переопределение – мощный инструмент объектно-ориентированного программирования, обеспечивающий создание гибких и расширяемых иерархий классов. Они позволяют избежать дублирования кода и эффективно модифицировать поведение базовых методов в классах-наследниках.