← Назад к вопросам

Какие знаешь виды полиморфизма?

1.2 Junior🔥 191 комментариев
#ООП и паттерны проектирования

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Виды полиморфизма в C#

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

1. Параметрический полиморфизм (Generics)

Позволяет создавать универсальные типы и методы, работающие с различными типами данных:

public class Repository<T> where T : class
{
    public T GetById(int id) { }
    public List<T> GetAll() { }
    public void Add(T entity) { }
}

// Использование
var userRepo = new Repository<User>();
var productRepo = new Repository<Product>();

2. Полиморфизм подтипов (Subtyping)

Используется наследование и переопределение методов. Включает два подвида:

Статический (compile-time) — Перегрузка методов (Method Overloading):

public class Calculator
{
    public int Add(int a, int b) => a + b;
    public double Add(double a, double b) => a + b;
    public int Add(int a, int b, int c) => a + b + c;
}

Динамический (runtime) — Переопределение методов (Method Overriding):

public abstract class Animal
{
    public virtual void Speak() => Console.WriteLine("Sound");
}

public class Dog : Animal
{
    public override void Speak() => Console.WriteLine("Woof!");
}

public class Cat : Animal
{
    public override void Speak() => Console.WriteLine("Meow!");
}

// Использование
Animal dog = new Dog();
Animal cat = new Cat();
dog.Speak(); // Woof!
cat.Speak(); // Meow!

3. Структурный полиморфизм (Duck Typing)

В C# реализуется через интерфейсы:

public interface ILogger
{
    void Log(string message);
}

public class ConsoleLogger : ILogger
{
    public void Log(string message) => Console.WriteLine(message);
}

public class FileLogger : ILogger
{
    public void Log(string message) => File.AppendAllText("log.txt", message);
}

4. Ad-hoc полиморфизм

Используется для специальных операций, например операторы для разных типов.

Практическое применение

  • Generic Repository Pattern — работа с любыми сущностями
  • Dependency Injection — подстановка разных реализаций через интерфейсы
  • Strategy Pattern — выбор алгоритма во время выполнения
  • Factory Pattern — создание объектов разных типов

Полиморфизм позволяет писать гибкий, расширяемый и тестируемый код, избегая дублирования и обеспечивая принцип открытости/закрытости (Open/Closed Principle).