Встречается на 55% собеседований по C#

Что такое полиморфизм

Полиморфизм — это ключевой принцип объектно-ориентированного программирования, который позволяет объектам разных классов обрабатываться через единый интерфейс, обеспечивая единообразную работу с различными типами данных. В C# полиморфизм реализуется в двух формах: статический (компиляционный) и динамический (выполнения).

Как это работает

Статический полиморфизм достигается с помощью перегрузки методов или операторов. Компилятор определяет, какой метод вызвать, на основе сигнатуры (количества и типов параметров) во время компиляции. Динамический полиморфизм основан на наследовании и виртуальных методах: вызов метода разрешается во время выполнения, что позволяет переопределять поведение в производных классах.

Пример

Пример статического полиморфизма — перегрузка метода Multiply:

csharp
class MathOperations
{
    public int Multiply(int a, int b)
    {
        return a * b;
    }

    public int Multiply(int a, int b, int c)
    {
        return a * b * c;
    }
}

Пример динамического полиморфизма — переопределение виртуального метода:

csharp
class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Some sound");
    }
}

class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Woof");
    }
}

При вызове MakeSound() на экземпляре Dog будет выполнена переопределённая версия, что демонстрирует динамическое связывание.

Подводные камни

  • Перегрузка методов не является полиморфизмом в чистом виде, но считается его формой; важно различать перегрузку (compile-time) и переопределение (runtime).
  • Для динамического полиморфизма необходимо использовать ключевое слово virtual в базовом классе и override в производном; иначе метод будет скрыт, а не переопределён.
  • Чрезмерное использование полиморфизма может усложнить код, если иерархия классов становится слишком глубокой.

Когда использовать

Полиморфизм применяется, когда нужно обрабатывать разные типы объектов единообразно, например, в коллекциях базового типа, при реализации паттернов (стратегия, фабрика) и для соблюдения принципа открытости/закрытости из SOLID. Он упрощает расширение функциональности без изменения существующего кода.

Коротко

  • Полиморфизм — способность объектов с одинаковым интерфейсом вести себя по-разному.
  • Статический полиморфизм — перегрузка методов/операторов, разрешается на этапе компиляции.
  • Динамический полиморфизм — переопределение виртуальных методов, разрешается на этапе выполнения.
  • Используется для уменьшения связанности и упрощения расширения кода.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы