Late binding

Late binding,或者dynamic binding,是指在运行时才确定对象的方法或者函数。
 
在面向对象的语言中,early binding, 或者static binding,是指在编译阶段函数就确定了所有类型的变量和表达式。编译后的函数通常存储在虚拟函数表(v-table)中。而在late binding,编译器没有足够的信息确定函数,所以使得v-table的有些项为空。在运行时,才能查找到v-table中空项对应的函数。
 
在COM(Component Object Model)编程使用late binding的主要优点是,在编译阶段不要求编译器去引用包含对象的库。这样可以避免因为类的v-table可能被修改而导致的库版本冲突。JIT编译的平台则不会有这种问题,例如.NET,Java。因为它们的v-table是在运行时创建的。
 

Late binding实现

Late binding in dynamically-typed object-oriented languages
在大多数动态类型语言中,对象的方法可以在运行时改变。这需要late binding。
 
Late binding in C++
在C++,late binding通常发生在关键字vitrual用于函数声明时,C++会创建虚拟函数表。当虚函数调用时,系统会查询虚拟函数表,来确定调用函数。这也是C++实现多态的机制。
 
Late binding in COM languages
在COM编程中,late-bound的函数调用由IDispatch接口实现。一些基于COM的语言支持调用IDispatch接口,例如Visual Basic 6。COM将参数类型定义为Object。其他语言(例如C++)要求调用GetIDsOfName来查找函数,然后调用函数。
 
Late binding in .NET
类似COM和Java,Common Language Runtime提供reflectoin API来实现late binding。使用Late binding的方法因不同的语言而不同,例如C#和Visual Basic。
 
在C# 4之前,C#只允许通过合适的reflection API来实现late binding。.NET,COM和DLR对象需要不同的reflection API。C# 4提供了动态虚拟类型。当使用late binding时,该类型会取代Object类型。
 
Late binding in Java
Java对late binding有三种定义。
 
Java的早期文档讨论了类如何在编译时不连接。Java的类型在编译时是严格检查的,可以通过在运行之前重写class文件来实现late binding。只有新的类的定义有相同的类名和函数名,代码就可以继续运行。这个角度类似于传统的late binding定义。
 
现在Java通常使用dynamic dispatch,即指Java使用虚函数的single dispatch机制。
 
最后,类似COM和.NET语言,Java使用reflection API和type intropection来实现late binding。通常只使用Java语言的程序员不认为这是late binding。
 

Criticism

Late binding的性能不如early binding。在多数late binding的实现中,每次调用函数必须查找正确的函数地址,造成相对昂贵的查询开销。
 
Late binding阻止了严格的类型检查。使用late binding调用时,编译器假设函数存在。这意味着如果函数拼写错误,会导致运行时错误。具体的异常因语言不同,通常类似于“函数没找到”,或者“缺少函数”。
 
Late binding阻止了IDE各种类型的静态分析。例如,IDE的“跳到定义”功能不能用于late-bound调用,因为IDE没办法知道符号指向的具体函数。另一个问题是,缺少类型信息导致不能创建依赖图。但是,其他类似虚接口的函数也会导致相同问题。
 

Reference

  1. Late binding, wikipedia
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值