Утиная типизация является одним из принципов объектно-ориентированного программирования и впервые была представлена в языке программирования 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, который обеспечивает гибкость и расширяемость кода. Она позволяет программистам писать более абстрактный код, который легко адаптируется к изменениям и требованиям в будущем.