C# Уроки: Виртуальные методы и переопределение

Виртуальные методы в 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 выведет имя и скорость.

Виртуальные методы и их переопределение – мощный инструмент объектно-ориентированного программирования, обеспечивающий создание гибких и расширяемых иерархий классов. Они позволяют избежать дублирования кода и эффективно модифицировать поведение базовых методов в классах-наследниках.

Что будем искать? Например,программа