动态语言的后期绑定与互操作性解析
1. 静态与动态对象
在编程的世界里,对象可分为静态对象和动态对象。静态对象没有自己的后期绑定逻辑,而动态对象则具备这一特性。例如, CSharpProduct 类的实例属于静态对象, RubyProduct 类的实例则是动态对象。并且,对象的类定义语言和使用语言可以不同。比如, RubyProduct 实例的源语言是 Ruby,当在 C# 中使用时,C# 就是宿主的目标语言;若将其传递给 IronPython 的 addPrice 方法,目标语言则变为 IronPython。
尽管 CSharpProduct 实例是静态对象,但通过 C# 的 dynamic 关键字,可将其当作动态对象处理。在某些情况下,“动态对象”既指像 Python 或 Ruby 中的真正动态对象,也指被当作动态对象处理的静态对象。
当静态对象被当作动态对象时,默认情况下,DLR 会用 DynamicMetaObject 类的实例对其进行包装,从而将静态对象转换为动态对象。不过, DynamicMetaObject 本身并未实现后期绑定行为,而是将后期绑定工作委托给目标语言的绑定器。所以,默认情况下,目标语言的绑定器负责处理静态对象的后期绑定行为。
DynamicMetaObject 是讨论动态对象时的重要类。在 DLR 中,后期绑定逻辑可存在于绑定器或动态对象中。动态对象的后期绑定逻辑并
超级会员免费看
订阅专栏 解锁全文
8

被折叠的 条评论
为什么被折叠?



