鸭子是否正在输入多态性的子集


17

从WIkipedia上的多态

在计算机科学中,多态是一种编程语言功能,它允许使用统一的界面来处理不同数据类型的值。

从维基百科上的鸭子打字

在使用面向对象的编程语言进行的计算机编程中,鸭子类型是一种动态类型的类型,其中对象的当前方法和属性集确定有效的语义,而不是其从特定类或特定接口的实现继承。

我的解释是,基于鸭子的类型,对象的方法/属性确定了有效的语义。这意味着对象的当前形状决定了它所坚持的界面。

从多态性可以说,如果一个函数接受多种不同的数据类型,只要它们支持一个接口,则该函数就是多态的。

因此,如果一个函数可以忽略类型,则它可以接受多种不同的数据类型并对其进行操作,只要这些数据类型具有正确的方法/属性并因此维护接口即可。

(术语“接口”的使用不是作为代码结构,而是作为描述性的文档结构)。

  • 鸭型与多态性的正确关系是什么?
  • 如果一种语言可以鸭式输入,是否意味着它可以做到多态?

1
不确定您在寻找什么答案。您准确地定义了两者,因此您可以获得尽可能多的确定答案。确定鸭子是否将“计数”定为多态性或多或少是一个哲学问题,或者如果您是这样说的话,则可能是一个术语问题。那么您在寻找什么答案呢?
psr

@psr我基本上是在说:“这是我的解释。我错了吗?我是对的吗?是否有可转载的学术人士以一种或另一种方式说它。是否有关于该主题的文章?” 除了“鸭子类型是多态性的实现/子集”以外,基本上还详细介绍了这种关系。
雷诺斯2011年

据我所知,单应性使得鸭子只能输入统一的界面=>而不是多态性,或者至少在维基百科如何定义它的意义上不能输入。EG door.close()tiger.close()
蚊蚋

4
鸭子分型是Ad-hoc多态性的一种情况。您想得太多了。
yannis 2011年

Answers:


16

我说多态性是一个通用特征,可以通过几种方式实现:

  • 基于类的继承。
  • 基于原型的对象(带有或不带有继承)
  • 鸭打字
  • 接口合规性(由Go的接口完成,并隐含在C ++模板上)

它们每个都允许程序员使用具有不同类型的单个代码,因此所有代码都体现了多态的概念。


7

我觉得:

鸭子的类型和多态性都是间接/抽象的手段。多态是基于类型和类型的概念,而鸭子类型则基于合同。

对于多态性,重要的是事物是什么,而不是其行为(它的行为可能是事物的结果)。

在鸭子打字中,事情的表现很重要。鸭子类型与对象的概念更紧密地联系在一起,即作为角色来交换消息,而不是具有某些已定义属性的对象。


2
错了 多态性是一个涵盖许多事物的巨大保护伞。特别是,它涵盖了鸭子的打字。因此,鸭子的分型是多态的一种形式。
Thomas Eding

我不同意。行为方法的传统继承具有相同的特征。通过明确保证对象表现出什么行为(不排除其他行为!)
这才

6

答案是肯定的

Duck Typing是动态类型化的一种特殊情况,即使动态类型本身不能直接视为多态性(因为在运行时而不是在编译时执行类型检查只是语言的属性),动态类型的基础,这种后期绑定动态调度多态性的特征。


维基百科文章的问题以及如今有多少人使用该术语,是因为它并没有定义我第一次看到鸭式输入时的含义(即一种输入形式),而是能够调用方法并抛出一个未定义运行时错误。正如埃里克·利珀特(Eric Lippert)解释的那样,这不是打字而是缺少打字。
reinierpost 2015年

1

鸭子类型并不是多态性的一个子集,因为多态性需要显式性,而鸭子性中却没有这种明确性。因此,鸭子输入有机会“实现”“接口”,这不是因为它具有语义意义,而是因为您具有相同的签名。如果鸭子类型是多态性的子集,那么它将具有多态性的所有属性,包括显式声明。

鸭子类型也不是真正的多态性实现,它是不同类型系统的一部分。通常,您将鸭子输入与动态语言相关联,动态语言会继续前进并向对象传递消息,而不知道对象是否可以处理它-如果可以,则它已经有效地通过了鸭子输入测试。通常,您会认为多态是在编译时通过设置vtable(如果接口与类不同,则是itable)来实现的。但是,这里有很多语言以及实现这些功能的许多方法。

在某种程度上,这是一个哲学问题。您能否将鸭子类型视为自动隐式声明的接口?确切地说,我无法想到任何错误的原因,但是我认为这可能不是最有效率的查看方式。我认为鸭子类型和接口都是编程语言的类型系统中经常遇到的功能,它们的行为方式都非常相似,并且两者对于程序员理解都很重要。


6
“多态性需要明确性”在哪里这么说?基于类的继承只是多态的一种形式,而不是唯一的一种。
哈维尔

继续@Javier的评论,临时多态性怎么样?
yannis 2011年

@YannisRizos-回答任何这样的问题是有太多的语言和太多的术语,不管你说什么,都有人可能会挑剔你。我理解为什么“即席多态性”的名称中带有“多态性”一词,但我认为这与OP所指的“多态性”不同。
psr

@Javier-您列出的所有方法都要求明确,除了鸭子类型。
psr

@psr实际上,我并不关心OP的“多态性”是什么意思。我认为没有人应该在意,这是一个具有非常简单定义的科学概念,我不认为我们应该根据自己的解释或我们可能认为是OP的解释来回答。特别是OP的解释,因为他默认是这样询问的,所以他不确定自己的解释。我不同意这是一个哲学问题,上述问题是一个科学问题,只有一个简单的答案:是的,鸭嘴打字是即席多态性的一种形式,是多态性的一个子集。
yannis

1

说“是的,如果foo具有鸭子类型,则foo具有多态性”几乎感觉很自然。但我不能说这100%肯定,在某种意义上,也许这可以拿出其中有鸭打字(“它可以呱&&可以将它浮在水面上==这样的系统的人工例子>这是一个鸭子”)虽然没有多态性(“ foo,quack!”失败了),但是它们确实是人造的,在现实世界中,我会说“是的,如果存在鸭子类型,那么也必须存在多态性”。

我个人认为鸭子的打字是“正确完成了多态”。我的意思是,鸭子类型世界中存在的事物不需要具有任何显式类型,并且它们的行为(多态=“相同访问,不同结果”)是唯一重要的事情。在多态的其他实现中,它受类型/接口/继承的约束,因此它是“实现和约束的多态”而不是“本身的多态”。


0

与在运行时执行所有类型一致性检查的语言相比,静态类型的编程语言允许更早地进行错误检查,更好地实施规范化的编程样式并生成更有效的目标代码。

(B.皮尔斯和朋友)

因此,您可以注意到,就这一点而言,鸭子类型是动态类型,其他方面则是真正的运行。

有一些方法可以确定与多态有关的类型,例如,使代码更灵活,但是在这些情况下,鸭子类型是另一个问题。

详细地,有类型化的lambda演算和未类型化的lambda演算,它们有助于确定计算和计算的属性。

我还看到,如果只想快速获得结果,诸如鸭子输入之类的事情就可以提供帮助,但在其他情况下,我还感到动态的特性使其可以根据需要进行调整,因此可以更快地进行计算。亲爱的,我想这只是说,如果我已经真正知道要计算的内容,那么键入是最好的,但是为什么我知道我想要什么呢?呵呵呵...

那是我的五分钱,我想这可以成为一个有趣的研究主题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.