Что такое полиморфизм
Полиморфизм — это ключевой принцип объектно-ориентированного программирования, который позволяет объектам разных классов обрабатываться через единый интерфейс, обеспечивая единообразную работу с различными типами данных. В C# полиморфизм реализуется в двух формах: статический (компиляционный) и динамический (выполнения).
Как это работает
Статический полиморфизм достигается с помощью перегрузки методов или операторов. Компилятор определяет, какой метод вызвать, на основе сигнатуры (количества и типов параметров) во время компиляции. Динамический полиморфизм основан на наследовании и виртуальных методах: вызов метода разрешается во время выполнения, что позволяет переопределять поведение в производных классах.
Пример
Пример статического полиморфизма — перегрузка метода Multiply:
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;
}
}Пример динамического полиморфизма — переопределение виртуального метода:
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. Он упрощает расширение функциональности без изменения существующего кода.
Коротко
- Полиморфизм — способность объектов с одинаковым интерфейсом вести себя по-разному.
- Статический полиморфизм — перегрузка методов/операторов, разрешается на этапе компиляции.
- Динамический полиморфизм — переопределение виртуальных методов, разрешается на этапе выполнения.
- Используется для уменьшения связанности и упрощения расширения кода.
