【发布时间】:2018-03-12 06:44:32
【问题描述】:
在后期绑定中,方法的名称在运行时绑定到类型。这与动态类型有何不同?
【问题讨论】:
-
嗯,当然不是。您尝试将在运行时将方法名称与类型绑定的特定 OOP 机制与一般检查类型的基本策略进行比较。但是,这两种技术共同降低了类型安全性。
标签: javascript types binding polymorphism
在后期绑定中,方法的名称在运行时绑定到类型。这与动态类型有何不同?
【问题讨论】:
标签: javascript types binding polymorphism
动态类型意味着您不必声明变量的类型;变量可以保存任何类型的值,并且类型是在运行时使用该变量时确定的。大多数脚本语言使用动态类型: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?
【讨论】: