Утиная типизация или Duck Typing - это концепция в программировании, которая гласит: "Если что-то выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, и есть утка." В контексте типизации это означает, что мы более заботимся о поведении объекта, чем о его собственно типе.
Для языков программирования, таких как C#, которые не поддерживают утиную типизацию напрямую, мы можем использовать интерфейсы для достижения подобного поведения.
Предположим, у нас есть разные классы "Duck" и "Human". Оба класса могут "говорить" и "ходить", но они различаются по своему типу.
Рассмотрим следующий код:
```csharp
interface ICanTalkAndWalk
{
void Talk();
void Walk();
}
class Duck : ICanTalkAndWalk
{
public void Talk()
{
Console.WriteLine("Дррнь-дррнь");
}
public void Walk()
{
Console.WriteLine("Утка идет");
}
}
class Human : ICanTalkAndWalk
{
public void Talk()
{
Console.WriteLine("Привет, я человек");
}
public void Walk()
{
Console.WriteLine("Человек идет");
}
}
```
В вышеупомянутом коде у нас есть "ICanTalkAndWalk" интерфейс и два класса "Duck" и "Human", которые реализуют этот интерфейс. Мы можем вызвать методы Talk() и Walk() от объекта ICanTalkAndWalk, независимо от того, является ли он уткой или человеком. Это упрощает работу кода с различными типами объектов, которые обладают одинаковым поведением.
```csharp
void DoSomething(ICanTalkAndWalk entity)
{
entity.Talk();
entity.Walk();
}
//...
Duck duck = new Duck();
Human human = new Human();
DoSomething(duck); // Drrn-drrn, Duck is walking.
DoSomething(human); // Hi, I am a human. Human is walking.
```
Это приближает нас к идее утиной типизации - мы можем оперировать объектами, интуитивно ориентируясь на их поведение, смягчая свою зависимость от строгих типов.