Liaison dynamique Objective-C

La liaison dynamique détermine la méthode à invoquer au moment de l'exécution plutôt qu'au moment de la compilation. La liaison dynamique est également appelée liaison tardive. En Objective-C, toutes les méthodes sont résolues dynamiquement lors de l'exécution. Le code exact exécuté est déterminé à la fois par le nom de la méthode (le sélecteur) et par l'objet récepteur.

La liaison dynamique permet le polymorphisme. Par exemple, considérons une collection d'objets comprenant Rectangle et Square. Chaque objet a sa propre implémentation d'une méthode printArea.

Dans le fragment de code suivant, le code réel qui doit être exécuté par l'expression [anObject printArea] est déterminé au moment de l'exécution. Le système d'exécution utilise le sélecteur de la méthode exécutée pour identifier la méthode appropriée dans la classe de l'objet anObject.

Regardons un code simple qui expliquerait la liaison dynamique.

#import <Foundation/Foundation.h>

@interface Square:NSObject {
   float area;
}

- (void)calculateAreaOfSide:(CGFloat)side;
- (void)printArea;
@end

@implementation Square
- (void)calculateAreaOfSide:(CGFloat)side {
   area = side * side;
}

- (void)printArea {
   NSLog(@"The area of square is %f",area);
}

@end

@interface Rectangle:NSObject {
   float area;
}

- (void)calculateAreaOfLength:(CGFloat)length andBreadth:(CGFloat)breadth;
- (void)printArea;
@end

@implementation  Rectangle

- (void)calculateAreaOfLength:(CGFloat)length andBreadth:(CGFloat)breadth {
   area = length * breadth;
}

- (void)printArea {
   NSLog(@"The area of Rectangle is %f",area);
}

@end

int main() {
   Square *square = [[Square alloc]init];
   [square calculateAreaOfSide:10.0];
   
   Rectangle *rectangle = [[Rectangle alloc]init];
   [rectangle calculateAreaOfLength:10.0 andBreadth:5.0];
   
   NSArray *shapes = [[NSArray alloc]initWithObjects: square, rectangle,nil];
   id object1 = [shapes objectAtIndex:0];
   [object1 printArea];
   
   id object2 = [shapes objectAtIndex:1];
   [object2 printArea];
   
   return 0;
}

Maintenant, lorsque nous compilons et exécutons le programme, nous obtiendrons le résultat suivant.

2013-09-28 07:42:29.821 demo[4916] The area of square is 100.000000
2013-09-28 07:42:29.821 demo[4916] The area of Rectangle is 50.000000

Comme vous pouvez le voir dans l'exemple ci-dessus, la méthode printArea est sélectionnée dynamiquement au moment de l'exécution. Il s'agit d'un exemple de liaison dynamique et est très utile dans de nombreuses situations lorsqu'il s'agit de types d'objets similaires.