Ответ
В программировании "утка" (duck) чаще всего относится к "Утиной типизации" (Duck Typing) — концепции, используемой в динамически типизированных языках (Python, JavaScript, Ruby).
Принцип: "Если что-то ходит как утка и крякает как утка, то это утка". Объект определяется не его классом (типом), а наличием у него определенных методов и свойств.
Пример на Python:
def make_it_quack(duck):
duck.quack() # Нас не интересует тип объекта, лишь наличие метода .quack()
class RealDuck:
def quack(self):
print("Quack!")
class ToyDuck:
def quack(self):
print("Squeak!")
class Dog:
def bark(self):
print("Woof!")
make_it_quack(RealDuck()) # Работает: "Quack!"
make_it_quack(ToyDuck()) # Работает: "Squeak!"
# make_it_quack(Dog()) # Ошибка: у Dog нет метода .quack()
В статически типизированных языках (Java, C#) этот принцип эмулируется с помощью:
- Интерфейсов: Определяют контракт (метод
quack()). - Шаблона проектирования "Адаптер".
Пример на Java:
interface Quackable {
void quack();
}
class MallardDuck implements Quackable {
public void quack() { System.out.println("Quack"); }
}
class RubberDuck implements Quackable {
public void quack() { System.out.println("Squeak"); }
}
class DuckSimulator {
static void simulate(Quackable duck) { // Принимаем любой объект, реализующий интерфейс
duck.quack();
}
public static void main(String[] args) {
simulate(new MallardDuck()); // Quack
simulate(new RubberDuck()); // Squeak
}
}