【问题标题】:What is the difference between Dynamic, Static and Late binding?动态、静态和后期绑定有什么区别?
【发布时间】:2014-03-15 18:19:56
【问题描述】:

我正在阅读 Apple 的 Object-Oriented Programming in Objective-C 指南。在Dynamism-->Dynamic Binding这个话题下,有三个概念:

  1. 动态绑定
  2. 后期绑定
  3. 静态绑定

我几乎已经理解了动态绑定和后期绑定之间的区别,但是静态绑定让我很困惑。有人可以用 Objective-C 或 C++ 中的示例解释这三个概念之间的区别吗?

注意:在您考虑将此问题标记为重复之前,SO 上没有同时描述这三件事的问题。

【问题讨论】:

  • 我在问题中提到的文档清楚地区分了后期绑定和动态绑定。看看那个。

标签: c++ ios objective-c oop object-oriented-analysis


【解决方案1】:

静态绑定:在编译时确定所引用的项目。在 (Objective-)C(++) 中,对 function 的调用是静态绑定的;例如库函数fabsNSLog。在这些语言中,对变量的引用也是静态的; 哪个变量被引用在编译时完全确定。静态绑定在运行时不会失败,无法确定静态绑定引用所指的内容是编译时错误。

后期绑定:这是在运行时确定所引用的确切项目的地方。这通常(但并非总是)发生在语言支持继承/子类型时,其中类型 T 可能是类型 S 的子类型/子/子类(术语取决于语言)。这意味着类型 T 的值具有所有类型 S 的值的属性,并且在包括方法的面向对象语言中,并且类型 T 的值可以被视为类型 S 的值。Java 示例:

TextComponent t; // a reference to a value of type TextComponent OR any of
                 // its subclasses, such as TextArea or TextField
Color c = t.getBackground(); // a call to TextComponent's getBackground method or
                             // TextArea's getBackground method etc.

哪个调用getBackground 方法直到运行时才确定,并且取决于t 引用的值的类型。但是必须有一个getBackground 方法,因为t 只能引用类型为TextComponent 或其子类型之一的值。事实上,当编译器编译这个片段时,TextComponent 的所有子类型可能都不知道,但这并不重要,因为子类型保证每个都有getBackground 方法。因此,与静态绑定一样,后期绑定在运行时不会失败。

动态绑定:这是后期绑定之外的一个步骤,它留给运行时来确定引用的项目是否存在。 Objective-C 中的一个简单示例:

id anyObject; // this can hold a reference to any Objective-C object

NSUInteger len = [anyObject length]; // TRY to call a method length on the object
                                     // referenced by anyObject. If at runtime this is,
                                     // say, an NSString or NSMutableString value it will
                                     // succeed. However if it is, say, an NSNumber value
                                     // it will FAIL

与后期绑定一样,实际调用的方法直到运行时才确定;然而,与后期绑定不同,这种方法是否存在也留给运行时。因此,与静态绑定和后期绑定不同,动态绑定可能在运行时失败

您可能会问:由于运行时错误的可能性,许多语言根本不支持动态绑定 - 它不适合安全关键软件,但适用于快速原型设计。然而,它确实允许以其他方式更难完成的设计,因此某些语言(如 Objective-C)确实如此,并且这些语言的用户必须接受权力带来责任的事实。 Xcode/Clang 编译器竭尽全力进行尽可能多的静态类型检查,大多数 Objective-C 代码将尽可能精确地使用类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多