鸭子类型

编辑
本词条由“匿名用户” 建档。
计算机编程中的鸭子类型是鸭子测试的应用--如果它走路像鸭子,叫声像鸭子,那么它一定是鸭子,以确定一个对象是否可以用于一个特定的目的。 在名词性类型中,如果一个对象被声明为某一类型(或者通过对象继承等机制推断出类型与对象的关联),那么该对象就属于某一类型。 在鸭子类型化中,如果一个对象具有该类型所要求的所有方法和属性,那么它就属于一个给定的类型。 鸭子类型化可以被看作是给定对象...

简介

编辑

计算机编程中的鸭子类型是鸭子测试的应用--如果它走路像鸭子,叫声像鸭子,那么它一定是鸭子,以确定一个对象是否可以用于一个特定的目的

在名词性类型中,如果一个对象被声明为某一类型(或者通过对象继承等机制推断出类型与对象的关联),那么该对象就属于某一类型。

在鸭子类型化中,如果一个对象具有该类型所要求的所有方法和属性,那么它就属于一个给定的类型。

鸭子类型化可以被看作是给定对象和类型要求之间的基于使用的结构等价物。关于结构类型等价的进一步解释,请参见结构类型化。

鸭子类型的例子

编辑

这是Python3中的一个简单例子,演示了任何对象如何在任何情况下被使用,直到它被用在它不支持的地方。

鸭子游泳

编辑

鸭子飞翔鲸游泳AttributeError:'Whale'objecthasnoattribute'fly'(属性错误)。

所以,如果我们假设所有会游泳的东西都是鸭子,因为鸭子会游泳,我们会认为鲸鱼是鸭子,但是,如果我们也假设它必须能够飞行,鲸鱼就不会被认为是鸭子。

在静态类型语言中

编辑

在一些静态类型语言中,如Boo和D,类的类型检查可以被指定为在运行时而不是编译时发生。

与其他类型系统的比较

编辑

结构类型系统鸭子类型类似于结构类型,但又不同于结构类型。

结构化类型是一个静态的类型系统,通过类型的结构来确定类型的兼容性和等价性,而鸭式类型是动态的,只通过类型结构中在运行时被访问的部分来确定类型的兼容性。

TypeScript、Elm和Python语言在不同程度上支持结构类型。

协议和接口

编辑

协议和接口提供了一种方法,可以明确声明一些方法、操作符或行为需要被定义(例如,必须有一个quack()方法)。

如果一个第三方库实现了一个不能修改的类,那么客户就不能使用该库未知接口的实例,即使该类事实上满足接口要求。

这个问题的一个常见解决方案是适配器模式。相比之下,在鸭子类型下,该对象将被直接接受,而不需要适配器。

模拟鸭子类型

模板或通用类型

编辑

模板,或通用函数或方法在静态类型化的背景下应用鸭子测试;这带来了一般静态与动态类型检查的所有优点和缺点。

鸭子类型也可以更灵活,因为只有在运行时实际调用的方法需要被实现,而模板需要实现所有在编译时不能被证明为不可达的方法。

在Java、Scala和Objective-C等语言中,反射可以用来检查对象是否实现方法,甚至在运行时添加必要的方法。

例如,Java的MethodHandleAPI就可以以这种方式使用。

内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/170710/

(4)
词条目录
  1. 简介
  2. 鸭子类型的例子
  3. 鸭子游泳
  4. 在静态类型语言中
  5. 与其他类型系统的比较
  6. 协议和接口
  7. 模板或通用类型

轻触这里

关闭目录

目录