鸭子类型 鸭子类型英語duck typing在程序设计中是动态类型的一种风格在这种风格中一个物件有效的语义不是由继承自特定的类或实现特定的接口而是由当前方法和属性的集合决定这个概念的名字来源于由詹姆斯惠特科姆莱利英语James Whitcomb Riley提出的鸭子测试见下面的历史章节鸭子测试可以这样表述 当看到一只鸟走起来像鸭子游泳起来像鸭子叫起来也像鸭子那么这只鸟就可以被称为鸭子 在鸭子类型中关注点在于物件的行为能做什么而不是关注物件所属的类型例如在不使用鸭子类型的语言中我们可以编写一个函数它接受一个类型为鸭子的物件并调用它的走和叫方法在使用鸭子类型的语言中这样的一个函数可以接受一个任意类型的物件并调用它的走和叫方法如果这些需要被调用的方法不存在那么将引发一个运行时错误任何拥有这样的正确的走和叫方法的物件都可被函数接受的这种行为引出了以上表述这种决定类型的方式因此得名 鸭子类型通常得益于不测试方法和函数中参数的类型而是依赖文档清晰的代码和测试来确保正确使用 在常规类型中我们能否在一个特定场景中使用某个物件取决于这个物件的类型而在鸭子类型中则取决于这个物件是否具有某种属性或者方法即只要具备特定的属性或方法能通过鸭子测试就可以使用