Objective-C 动态绑定

动态绑定是在运行时而不是编译时确定要调用的方法。动态绑定也称为后期绑定。

在 Objective-C 中,所有方法都是在运行时动态解析的。执行的确切代码由方法名(选择器)和接收对象确定。

动态绑定支持多态性。例如,比如一组对象,包括矩形和正方形。每个对象都有自己的 printArea 方法实现。

在下面的代码片段中,表达式 [anObject printArea] 应该执行的实际代码在运行时确定。运行时系统使用方法运行的选择器来识别 anObject 的每个类中的适当方法。

让我们看一段解释动态绑定的简单代码:

  1. #import <Foundation/Foundation.h>
  2. @interface Square:NSObject {
  3. float area;
  4. }
  5. - (void)calculateAreaOfSide:(CGFloat)side;
  6. - (void)printArea;
  7. @end
  8. @implementation Square
  9. - (void)calculateAreaOfSide:(CGFloat)side {
  10. area = side * side;
  11. }
  12. - (void)printArea {
  13. NSLog(@"The area of square is %f",area);
  14. }
  15. @end
  16. @interface Rectangle:NSObject {
  17. float area;
  18. }
  19. - (void)calculateAreaOfLength:(CGFloat)length andBreadth:(CGFloat)breadth;
  20. - (void)printArea;
  21. @end
  22. @implementation Rectangle
  23. - (void)calculateAreaOfLength:(CGFloat)length andBreadth:(CGFloat)breadth {
  24. area = length * breadth;
  25. }
  26. - (void)printArea {
  27. NSLog(@"The area of Rectangle is %f",area);
  28. }
  29. @end
  30. int main() {
  31. Square *square = [[Square alloc]init];
  32. [square calculateAreaOfSide:10.0];
  33. Rectangle *rectangle = [[Rectangle alloc]init];
  34. [rectangle calculateAreaOfLength:10.0 andBreadth:5.0];
  35. NSArray *shapes = [[NSArray alloc]initWithObjects: square, rectangle,nil];
  36. id object1 = [shapes objectAtIndex:0];
  37. [object1 printArea];
  38. id object2 = [shapes objectAtIndex:1];
  39. [object2 printArea];
  40. return 0;
  41. }

结果如下:

  1. 2022-07-07 07:42:29.821 demo[4916] The area of square is 100.000000
  2. 2022-07-07 07:42:29.821 demo[4916] The area of Rectangle is 50.000000

正如您在上面的实例中看到的,printArea 方法在运行时是动态选择的。它是动态绑定的一个实例,在处理类似类型的对象时,在许多情况下非常有用。