Что такое наследование в ООП?

«Что такое наследование в ООП?» — вопрос из категории ООП, который задают на 28% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Наследование — это один из четырёх основных принципов объектно-ориентированного программирования (ООП), который позволяет одному классу (дочернему или производному) наследовать поля и методы другого класса (родительского или базового). Это создаёт иерархию «является» (is-a) и способствует повторному использованию кода.

Ключевые цели и преимущества:

  • Повторное использование кода: Не нужно дублировать общую логику в родственных классах.
  • Расширяемость: Дочерний класс может добавлять новое поведение или переопределять унаследованное.
  • Полиморфизм: Объекты дочернего класса могут использоваться там, где ожидается объект родительского класса.

Основные концепции:

  • Переопределение метода (Method Overriding): Дочерний класс предоставляет свою конкретную реализацию метода, уже объявленного в родительском классе.
  • Спецификаторы доступа:
    • public — доступ отовсюду.
    • protected — доступ из самого класса и его наследников.
    • private — доступ только из самого класса.

Пример на C#:

// Базовый класс
public class Vehicle
{
    public string Brand { get; set; }
    public virtual void Move()
    {
        Console.WriteLine($"{Brand} is moving in some way.");
    }
}

// Дочерний класс, наследующий Vehicle
public class Car : Vehicle
{
    // Переопределение метода
    public override void Move()
    {
        Console.WriteLine($"{Brand} car is driving on the road.");
    }

    // Новый метод, специфичный для Car
    public void Honk() => Console.WriteLine("Beep beep!");
}

// Использование
Vehicle myVehicle = new Car { Brand = "Toyota" };
myVehicle.Move(); // Вывод: "Toyota car is driving on the road."
// Демонстрация полиморфизма: переменная типа Vehicle,
// но вызывается переопределённый метод Car.Move()

Важно: В языках вроде C# и Java поддерживается одиночное наследование классов (один родитель), но множественная реализация интерфейсов.