Правило " Duck Typing " такое:
Если оно выглядит как утка, плавает как утка и крякает как утка, то это, вероятно, утка,
В объектно-ориентированном языке программирования на основе классов (например, C ++), чтобы оба объекта выглядели как утка, вы должны наследовать их классы от общего класса "interface", чтобы компиляторпозвольте вам вызывать duck
методы для них.Это называется строгой типизацией.
Вот как это делается в Javascript:
var duck = {
appearance: "feathers",
quack: function duck_quack(what) {
print(what + " quack-quack!");
},
color: "black"
};
var someAnimal = {
appearance: "feathers",
quack: function animal_quack(what) {
print(what + " whoof-whoof!");
},
eyes: "yellow"
};
function check(who) {
if ((who.appearance == "feathers") && (typeof who.quack == "function")) {
who.quack("I look like a duck!\n");
return true;
}
return false;
}
check(duck); // true
check(someAnimal); // true
Видите, функция check
проверяет, выглядит ли переданный объект как утка (он проверяет внешний вид и его способность крякать)).Мы передаем ему два разных объекта, и он вернет true
на обоих.Помимо внешнего вида и кряка это могут быть совершенно разные вещи, но В ЭТОЙ ОСОБЕННОСТИ check
они ведут себя одинаково (имеют общий интерфейс), они оба выглядят как «утка».Мы можем вызвать метод quack
для обоих объектов (и кого это волнует).