鸭子类型的通俗说法是: “如果一只鸡 走起 路来像鸭子,叫起来也是鸭子,那么它就是鸭子。”
我们可以通过一个小故事来更深刻地了解鸭子类型:
从前在 JavaScript 王国里,有一个国王,他觉得世界上最美妙的声音就是鸭子的叫 声,于是国王召集大臣,要组建一个 1000 只鸭子组成的合唱团。大臣们找遍了全国, 终于找到 999 只鸭子,但是始终还差一只,最后大臣发现有一只非常特别的鸡,它的 叫声 跟鸭子一模一样,于是这只鸡就成为了合唱团的最后一员。
这个故事告诉我们,国王要听的只是鸭子的叫声,这个声音的主人到底是鸡还是鸭并不重要。 鸭子类型指导我们只关注对象的行为,而不关注对象本身,也就是关注 HAS-A, 而不是 IS-A。
只要两个类具有相同的方法,就可以实现多态,并不要求两个类之间有任何关系,这就是所谓的 duck-typing,是一些动态语言所特有的语法机制。