Ruby中的duck-typing和polymorphism有什么区别?

时间:2015-12-16 18:49:22

标签: ruby polymorphism

我正在阅读“Back to Basics: Polymorphism and Ruby”,似乎他们将多态定义为:

  

多态性 - 为不同类型的实体提供单一接口

听起来很像

  

duck-typing:在使用面向对象编程语言的计算机编程中,duck typing是一个编程语言层和设计规则在打字之上。键入涉及为任何对象分配类型。鸭子打字涉及为某种目的确定物体的适用性。通过正常键入,假定适用性仅由对象的类型确定。在duck typing中,对象的适用性取决于某些方法和属性(具有适当的含义)的存在,而不是对象的实际类型。

根据链接,鸭子类型似乎是一个方法根据接收其消息的对象而表现不同的方式。但这听起来很像多态,不是吗?

1 个答案:

答案 0 :(得分:1)

Ruby 松散 动态类型 和解释语言,没有严格的类型检查类型检查是在运行时完成。当你在对象上调用一个方法时,只要它定义了那个方法 - 你就可以调用它,Ruby也不会抱怨。这是鸭子打字 - “如果它像鸭子一样呱呱叫它就是鸭子” - 换句话说,“如果一个对象响应一个类的所有方法,那么,它的类型就是那个类”。 Ruby并不太关心类 - 它只是调用对象上的方法。

你无法在更严格的意义上证明多态性,因为可以在 strong 静态类型的编译语言(如Java)中进行,其中对象的类必须是它所分配的变量的类型to或必须是变量类型的派生类,或者如果变量的类型是接口,则实现接口。

如果需要,可以验证对象的类型是否是特定类,如“How do I check if a variable in an instance of a class?”中所述。

您可能还想read discussion to understand the terminologies used to characterize languages based on the type system