【问题标题】:Is dynamic typing the same as dynamic(late) binding?动态类型与动态(后期)绑定相同吗?
【发布时间】:2018-03-12 06:44:32
【问题描述】:

在后期绑定中,方法的名称在运行时绑定到类型。这与动态类型有何不同?

【问题讨论】:

  • 嗯,当然不是。您尝试将在运行时将方法名称与类型绑定的特定 OOP 机制与一般检查类型的基本策略进行比较。但是,这两种技术共同降低了类型安全性。

标签: javascript types binding polymorphism


【解决方案1】:

动态类型意味着您不必声明变量的类型;变量可以保存任何类型的值,并且类型是在运行时使用该变量时确定的。大多数脚本语言使用动态类型:Javascript、PHP、Python。这与在 C、C++ 和 Java 中使用的静态类型形成对比。

但是,具有静态类型的 OO 语言确实允许有限形式的动态,因为一个类可以有子类。在 Java 中,声明为包含一个类的变量也可以包含它的任何子类;在 C++ 中,指向基类的指针也可以指向派生类的对象。

后期绑定是指如何选择多态函数的方法。如果您有一个类和一个子类,并将一个方法绑定到这些类之一的实例,它是使用执行绑定的类(可能是父类)还是对象的实际类。早期绑定意味着它使用执行绑定的类,后期绑定意味着它使用对象的实际类。 Javascript 实际上没有类,所以在这种情况下,它指的是原型链中的哪个原型包含执行方法绑定的函数。

这两个概念显然是相关的。如果一个变量只能保存一个类型的对象,那么后期绑定就没有意义,所以后期绑定依赖于动态类型。在 C++ 中,当您通过对象变量调用成员函数时,您会获得早期绑定,例如var.func()。要获得后期绑定,成员函数必须声明为virtual,并且您必须通过指针ptr->func() 调用它。在 Java 和 Javascript 中,您通常会得到后期绑定,但可以使用 Function.prototype.bind() 来调用特定原型的方法。

Early and Late Binding 展示了如何在 Javascript 原型中实现早期绑定和后期绑定。

编辑:

糟糕,该链接不再有效,而且似乎没有在 Wayback Machine 中存档。目前,我能找到的最佳讨论是在 Software Engineering SE:What is early and late binding?

【讨论】:

  • 这是静态和动态调度。后期绑定意味着当我在对象上调用方法时,编译器不知道该方法是否可以被调用,即这种方法是否存在于某处。这被推迟到运行时,其中方法的名称绑定到某个实际方法,然后执行动态调度,这意味着根据实际对象的类型选择正确的方法实现。如果这样的函数不存在,则会出现运行时错误。那么,动态类型是否意味着后期绑定?我可以同时进行静态类型和后期绑定吗?
  • 我认为如果您想了解详细程度,您应该在 cs.stackexchange.com 上询问。
  • @Barmar 您的链接已损坏,该站点已不存在且未存档。你能推荐其他资源吗?
  • @ygoe 谢谢。我尝试寻找另一个资源,我添加了指向 softwareengineering.SE 的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
相关资源
最近更新 更多