>[success] # 鸭子类型 [编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别](https://www.cnblogs.com/zy1987/p/3784753.html?utm_source=tuicool) ~~~ 1.起源:意大利软件工程师、Python软件基金会研究员Alex Martelli 于2000年 左右在Python的邮件组中最早将这个概念引入了程序设计范畴中 2.概念来源:Duck typing 这个概念来源于美国印第安纳州的诗人詹姆斯·惠特 科姆·莱利(James Whitcomb Riley,1849-1916)的诗句: " When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck."、 3.中文意思:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭 子,那么这只鸟就可以被称为鸭子。” ~~~ >[info] ## 鸭子类型 -- 解释 ~~~ 1.简单的说鸭子类型:只关心对象的行为,不关心对象本身 2.举个书中的例子:js 王国的国王觉得鸭子叫声很美妙,他要组织一个大型 的鸭子合唱团,一共需要1000只鸭子,但是最后全国只找到了999只,但还 差一只,怎么办?就在这个时候发现一只鸡叫起来和鸭子一样,这只鸡就成 了第1000个合唱团的成员 3.通过上面的第二条的解释也可以发现:鸭子和鸡就是编程时候的'实例对象' ,我们不关心你是'鸭子对象'还是'鸡对象',只关心你能不能像'鸭子一样叫', 这个叫就是'行为' ~~~ >[danger] ##### 通过代码实现 ~~~ 1.像下面的代码案例,以后不管你是鸡鸭鱼还是其他动物,只要你会鸭子叫就能加 入合唱团,我们只需要吧这类实例放到'joinChoir' 方法中 ~~~ ~~~ // 鸭子 const duck = { duckSing:function () { console.log('嘎嘎嘎') } } // 会鸭子叫的鸡 const chicken = { duckSing:function () { console.log('嘎嘎嘎') } } const choir = [] // 合唱团 function joinChoir(animal) { // 只关心你的行为 是能发出鸭子叫 if(animal && typeof animal.duckSing === 'function'){ choir.push(animal) } } joinChoir(duck) joinChoir(chicken) console.log(choir) // 鸭子 ~~~ >[danger] ##### 鸭子类型 -- 在静态类型语言 ~~~ 1.js 这种动态类型语言不会有类型检查,因此当我们调用'joinChoir' 方法的时候,根本 关心参数的类型,但静态类型语言不是这样,以java 为例你需要声明'joinChoir'参数类型 但是如果你声明参数类型只是鸭子,当你传入鸡的类型就会提示错误,由于java支持向 上转型,就可以用接口的形式,让这些实例都继承鸭子叫的接口,即'joinChoir'传参的时候 只需要继承过这些接口的实例即可 ~~~