Что такое утиная типизация в C# (на примере интерфейсов)?

Утиная типизация является одним из принципов объектно-ориентированного программирования и впервые была представлена в языке программирования Smalltalk. В C# утиная типизация осуществляется с помощью интерфейсов.

Утиная типизация позволяет объектам разных классов реализовывать один и тот же интерфейс и использоваться в коде, сосредоточенном на работе с этим интерфейсом. Это означает, что важно не то, какой объект передается в метод или функцию, а то, как он может быть использован. Таким образом, утиная типизация позволяет объекту "ходить как утка и крякать как утка".

Рассмотрим пример. Представим, что у нас есть интерфейс IFlyable, который имеет метод Fly(). И у нас есть два класса, "Duck" (Утка) и "Airplane" (Самолет), которые реализуют этот интерфейс.

public interface IFlyable
{
    void Fly();
}

public class Duck : IFlyable
{
    public void Fly()
    {
        Console.WriteLine("Duck is flying");
    }
}

public class Airplane : IFlyable
{
    public void Fly()
    {
        Console.WriteLine("Airplane is flying");
    }
}

Теперь мы можем создать массив объектов типа IFlyable и вызвать для каждого из них метод Fly() без знания, какой именно объект в массиве.

IFlyable[] flyingObjects = new IFlyable[2];
flyingObjects[0] = new Duck();
flyingObjects[1] = new Airplane();

foreach (var obj in flyingObjects)
{
    obj.Fly();
}

В результате выполнения этого кода мы получим следующий вывод:

Duck is flying
Airplane is flying

Как видно из примера, утиная типизация позволяет вызывать методы объектов, которые реализуют один и тот же интерфейс, независимо от их конкретного типа. Это делает код более гибким и позволяет легко добавлять новые классы, реализующие интерфейс IFlyable, без изменения существующего кода.

Утиная типизация является одним из основных принципов SOLID, который обеспечивает гибкость и расширяемость кода. Она позволяет программистам писать более абстрактный код, который легко адаптируется к изменениям и требованиям в будущем.