Полиморфизм в C#: изучение методов гибкого поведения объектов

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

  1. Перегрузка метода: позволяет определить несколько методов с одинаковым именем, но разными параметрами. Соответствующий метод выбирается на основе количества, типов и порядка аргументов во время компиляции.
public void DoSomething(int value)
{
    // Code for handling integer value
}
public void DoSomething(string value)
{
    // Code for handling string value
}
  1. Переопределение метода: позволяет производному классу предоставлять другую реализацию метода, который уже определен в его базовом классе. Это достигается с помощью ключевого слова override.
public class Shape
{
    public virtual void Draw()
    {
        // Base implementation
    }
}
public class Circle : Shape
{
    public override void Draw()
    {
        // Implementation specific to Circle
    }
}
  1. Абстрактные классы. Абстрактные классы не могут быть созданы и обычно используются в качестве базовых классов для других классов. Они могут определять абстрактные методы, которые должны быть реализованы производными классами. Это позволяет создать общий интерфейс, обеспечивая при этом гибкость реализации.
public abstract class Vehicle
{
    public abstract void Start();
}
public class Car : Vehicle
{
    public override void Start()
    {
        // Code for starting a car
    }
}
public class Bike : Vehicle
{
    public override void Start()
    {
        // Code for starting a bike
    }
}
  1. Интерфейсы. Интерфейсы определяют контракт, определяющий набор методов, свойств и событий, которые должен реализовать класс. Несколько интерфейсов могут быть реализованы в одном классе, что обеспечивает полиморфное поведение.
public interface IShape
{
    void Draw();
}
public class Circle : IShape
{
    public void Draw()
    {
        // Code for drawing a circle
    }
}
public class Square : IShape
{
    public void Draw()
    {
        // Code for drawing a square
    }
}
  1. Полиморфные параметры: методы могут принимать параметры базового класса или типа интерфейса, что позволяет передавать объекты различных производных классов или реализаций. Это обеспечивает гибкость и позволяет повторно использовать код.
public void ProcessShape(Shape shape)
{
    shape.Draw();
}