Полиморфизм в C#

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

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

Компиляционный (статический) полиморфизм

Этот вид полиморфизма достигается с помощью перегрузки методов (method overloading) и операторов (operator overloading).

Пример перегрузки методов:

public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }

    public double Add(double a, double b)
    {
        return a + b;
    }
}

Пример перегрузки операторов:

public class Vector
{
    public int X { get; set; }
    public int Y { get; set; }
    
    public static Vector operator +(Vector a, Vector b)
    {
        return new Vector { X = a.X + b.X, Y = a.Y + b.Y };
    }
}

Исполняемый (динамический) полиморфизм

Этот вид полиморфизма достигается через переопределение (override) виртуальных методов и использование интерфейсов.

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

public class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("Animal makes a sound");
    }
}

public class Dog : Animal
{
    public override void Speak()
    {
        Console.WriteLine("Dog is barking");
    }
}

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

public interface IShape
{
    void Draw();
}

public class Circle : IShape
{
    public void Draw()
    {
        Console.WriteLine("Drawing a circle");
    }
}

public class Square : IShape
{
    public void Draw()
    {
        Console.WriteLine("Drawing a square");
    }
}

Применение полиморфизма

Полиморфизм позволяет:

  • Создавать гибкие и расширяемые программы.
  • Уменьшать дублирование кода.
  • Повышать удобство сопровождения и модификации кода.

Полиморфизм – важный механизм в C#, позволяющий строить гибкие архитектуры программ. Использование перегрузки, виртуальных методов и интерфейсов помогает эффективно управлять сложностью кода и повышать его переиспользуемость.