知识卡片
鸭子类型把判断依据从对象是什么换成对象能做什么
内容
一个对象是否可以用在某个场合,可以有两种判断依据:一种是先声明它属于某个类型或实现了某个接口(客观式定义),另一种是只要它实际具备所需要的方法就能用,不管它声明成什么类型(主观式定义,即鸭子类型)。后一种判断方式把关注点从对象是什么转移到对象能做什么,两个毫无继承关系的类型只要都提供了同名方法,就能在同一段代码里互换使用,这是实现多态的另一条路径,不依赖继承体系本身。
参考来源
- 位置:《架构之美》第14章《重读经典》14.2节《类型是隐式定义的》(源文件:程序之美系列套装(6册)团队之美、项目管理之美、架构之美、数据之美、测试之美、安全之美/_epub-src/OEBPS/Text/part0278.xhtml)
- 结论依据:原文明确"类型是根据它们的行为隐式定义的,而不是根据它们的接口。这被称为潜在类型或鸭子类型",并以Dog和Robot两个无共同超类的类都实现talk方法为例说明"鸭子类型提供了另一种实现多态的方法:只要一个类型提供的方法适用于某个上下文,它就可以用于该上下文"。
- 原始内容:类型是根据它们的行为隐式定义的,而不是根据它们的接口。这被称为潜在类型或鸭子类型……鸭子类型提供了另一种实现多态的方法:只要一个类型提供的方法适用于某个上下文,它就可以用于该上下文。