Что такое полиморфизм в ООП?

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

Ответ

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

Основные формы в C#:

  1. Полиморфизм подтипов (наследование и переопределение): Базовый класс объявляет виртуальный метод, производные классы предоставляют свою реализацию.

    public class Document
    {
        public virtual void Print() => Console.WriteLine("Печать базового документа.");
    }
    
    public class PdfDocument : Document
    {
        public override void Print() => Console.WriteLine("Отправка PDF на виртуальный принтер.");
    }
    
    public class WordDocument : Document
    {
        public override void Print() => Console.WriteLine("Запуск MS Word для печати.");
    }
    
    // Использование: один интерфейс, разное поведение
    List<Document> docs = new() { new Document(), new PdfDocument(), new WordDocument() };
    foreach (var doc in docs)
    {
        doc.Print(); // Вызовется своя реализация для каждого типа
    }
  2. Полиморфизм через интерфейсы: Разные, не связанные наследованием классы, реализуют один интерфейс.

    public interface ILogger
    {
        void Log(string message);
    }
    
    public class FileLogger : ILogger
    {
        public void Log(string message) => File.AppendAllText("log.txt", message);
    }
    
    public class ConsoleLogger : ILogger
    {
        public void Log(string message) => Console.WriteLine($"[LOG] {message}");
    }
    
    // Метод работает с любым ILogger
    public void ProcessOrder(ILogger logger)
    {
        logger.Log("Начало обработки заказа.");
        // ... логика
    }
  3. Перегрузка методов (Ad-hoc полиморфизм): Несколько методов с одним именем, но разными параметрами.

    public class Calculator
    {
        public int Add(int a, int b) => a + b;
        public double Add(double a, double b) => a + b;
        public string Add(string a, string b) => a + b; // конкатенация
    }

Выгода: Полиморфизм уменьшает связанность кода. Вы можете добавлять новые типы (например, ExcelDocument), не изменяя существующий код, который работает с базовым типом Document.

Видео-ответы