Sobes.tech
Назад к вопросам
Junior — Middle
61

Можете объяснить концепцию полиморфизма в объектно-ориентированном программировании?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Полиморфизм — это возможность работать с объектами разных типов через общий интерфейс или базовый класс. При этом один и тот же вызов ведёт себя по-разному в зависимости от реального типа объекта. В C# это обычно показывают через virtual/override и через интерфейсы.

Определение:

Полиморфизм в ООП — это принцип, при котором один и тот же контракт использования может иметь разные реализации. Код обращается к объектам через общий тип, а конкретное поведение определяется фактическим типом экземпляра во время выполнения.

В C# полиморфизм чаще всего проявляется в двух формах:

  • параметрический/подтиповый — работа через базовый класс или интерфейс;
  • динамический — переопределение методов (virtual, override).

Пример использования:

Например, есть интерфейс IShape, а разные фигуры по-своему считают площадь. Код, который печатает площадь, не знает конкретный тип фигуры и работает одинаково для всех реализаций.

using System;
using System.Collections.Generic;

interface IShape
{
    double Area();
}

class Circle : IShape
{
    public double Radius { get; }

    public Circle(double radius)
    {
        Radius = radius;
    }

    public double Area()
    {
        return Math.PI * Radius * Radius;
    }
}

class Rectangle : IShape
{
    public double Width { get; }
    public double Height { get; }

    public Rectangle(double width, double height)
    {
        Width = width;
        Height = height;
    }

    public double Area()
    {
        return Width * Height;
    }
}

class Program
{
    static void Main()
    {
        List<IShape> shapes = new List<IShape>
        {
            new Circle(3),
            new Rectangle(4, 5)
        };

        foreach (var shape in shapes)
        {
            Console.WriteLine(shape.Area());
        }
    }
}

Пояснение кода:

Код показывает полиморфизм через интерфейс.

  1. IShape задаёт общий контракт: у любой фигуры должен быть метод Area().
  2. Circle и Rectangle реализуют этот контракт по-своему.
  3. В списке List<IShape> хранятся объекты разных типов, но все они доступны через общий интерфейс.
  4. В цикле вызывается shape.Area(), и для каждого объекта выполняется своя реализация.
  5. Благодаря этому код клиента не зависит от конкретных классов фигур.

Ключевые моменты:

  • Полиморфизм позволяет писать код против абстракций, а не конкретных классов.
  • Один и тот же вызов метода может давать разный результат для разных объектов.
  • В C# полиморфизм удобно реализуется через интерфейсы и переопределение методов.
  • Это упрощает расширение системы: новые типы можно добавлять без изменения клиентского кода.
  • Полиморфизм повышает читаемость, гибкость и тестируемость кода.