早期绑定和后期绑定有什么区别?
发布于 2008-08-14 02:24:04
简而言之,早期(或静态)绑定指的是编译时绑定,而后期(或动态)绑定指的是运行时绑定(例如,当您使用反射时)。
发布于 2015-05-23 08:37:47
类似但更详细的答案来自赫伯特·斯奇尔特的C++一书:
早期绑定是指在编译时发生的事件。本质上,当在编译时知道调用函数所需的所有信息时,就会发生早期绑定。(换句话说,早期绑定意味着在编译期间绑定对象和函数调用。)早期绑定的示例包括普通函数调用(包括标准库函数)、重载函数调用和重载操作符。早期绑定的主要优点是效率。因为调用函数所需的所有信息都是在编译时确定的,所以这些类型的函数调用非常快。
早期绑定的对立面是后期绑定。后期绑定是指直到运行时才解析的函数调用。虚函数用于实现后期绑定。正如您所知道的,当通过基指针或引用进行访问时,实际调用的虚拟函数由指针所指向的对象类型决定。因为在大多数情况下,这不能在编译时确定,所以对象和函数直到运行时才被链接。后期绑定的主要优点是灵活性。与早期绑定不同,后期绑定允许您创建程序,这些程序可以响应程序执行时发生的事件,而不必创建大量的“应急代码”。请记住,由于函数调用直到运行时才被解析,因此后期绑定可能会使执行时间稍慢一些。然而,今天,快速的计算机已经大大减少了与后期绑定相关的执行时间。
发布于 2008-08-14 02:21:56
在解释型语言中,差异要稍微细微一些。
Ruby:
# early binding:
def create_a_foo(*args)
Foo.new(*args)
end
my_foo = create_a_foo
# late binding:
def create_something(klass, *args)
klass.new(*args)
end
my_foo = create_something(Foo)
因为Ruby (通常)是不编译的,所以没有编译器来做这些漂亮的前期工作。然而,JRuby的发展意味着现在有更多的Ruby被编译,这使得它的行为更像上面的Java。
IDE的问题仍然存在:如果您对类定义进行硬编码,像Eclipse这样的平台可以查找它们,但是如果您将它们留给调用者,则不能。
控制反转在Ruby中并不是特别流行,可能是因为其极端的运行时灵活性,但Rails很好地利用了后期绑定来减少运行应用程序所需的配置量。
https://stackoverflow.com/questions/10580
复制相似问题