Objectives-C : les protocoles
Sans doute l’une des notions les moins évidentes, et les plus spécifiques à l’objective C, c’est les protocoles.
Un protocole est une façon de dire à une classe d’implémenter la méthode d’une autre, ce qui signifie qu’une classe peut déléguer l’implémentation de sa méthode à une autre classe, (“ délégué “ rappelez vous de ce terme )
Supposons qu’on a deux classes, Medecin et Policier.
Medecin a une méthode “soigner“, c’est ce que le médecin fait le mieux
.
Donc si on veut appliquer le principe des protocoles sur ces deux classes, la classe Policier va implémenter la méthode soigner, donc faire le travail du médecin
Voilà le code de la classe Medecin :
Medecin.h
|
1 2 3 4 5 6 7 |
@protocol delegueMedecin
-(void)delegueSoigne:(NSString *)patient;
@end
@interface Medecin : NSObject
@property(nonatomic, retain) iddelegue;
-(void)soigner:(NSString *)patient;
@end |
au début on a créé un protocole delegueMedecin avec le mot clé @protocol.
Et puisqu’il va permettre à Policier d’implémenter la méthode soigner, on a déclaré une méthode delegueSoigne dans delegueMedecin
delegueMedecin va jouer le rôle d’intermédiaire entre la classe Medecin, et la classe Policier.
Comme ça, policier n’aura accès qu’au protocole delegueMedecin, et n’implémentera que les méthodes définies dans ce protocole.
Dans le fichier .m de la classe Médecin, on a écrit la méthode soigner qui prend un paramètre patient de type NSString.
Medecin.m
|
1 2 3 4 5 6 |
@implementation Medecin
@synthesize delegue;
-(void)soigner:(NSString *)patient{
[self.delegue delegueSoigne:patient];
}
@end |
dans la méthode soigner on passe la main à “delegue”. donc ici la méthode soigner ne fait rien a part exécuter la méthode delegueSoigne du delegue.
Policier.h
|
1 2 3 |
#import "Medecin.h"
@interface Policier : NSObject
@end |
remarquez qu’on a jouté après NSObject , ça indique que Policier peut implémenter les méthodes du protocole delegueMedecin
Policier.m
|
1 2 3 4 5 6 7 |
#import "Policier.h"
@implementation Policier
@synthesize medecin;
-(void)delegueSoigne:(NSString *)patient{
NSLog(@"je suis un policier, je fais le travail du médecin, je soigne %@",patient);
}
@end |
et comme prévu , on implémente la méthode delegueSoigne dans la classe Policier, dans laquelle on affiche un message où il y a le paramètre “patient”.
main.m
|
1 2 3 4 5 6 |
Medecin *medecin=[[Medecin alloc]init];
Policier *policier=[[Policier alloc]init];
medecin.delegue=policier;
[medecin soigner:@"simo"];
[policier release];
[medecin release]; |
dans le main on a créé deux objets, médecin et policier.
medecin.delegue=policier;cette ligne signifie que l’objet policier est le délégué de l’objet médecin, policier se porte volontaire pour faire le travail du médecin (redéfinir sa méthode)
[medecin soigner:@"simo"]; ici on exécute la méthode en lui passant en paramètre un NSString dont la valeur est “simo”.
[policier release];
[medecin release];
Enfin on libère la mémoire occupée par nos deux objets.
Une fois on exécute notre programme, on remarque que c’est la méthode de la classe Policier qui a été exécutée, alors qu’on a appelé la méthode de la classe médecin.
j’avoue que ça serait rare où vous allez créer vos propres protocoles, mais cela vous permettra de comprendre la notion de “delegate”,car si vous faites du développement IOS, vous allez voir que cette notion est utilisée dans la majorité des composants.











Cool !
Par contre une question, avec la nouvelle version de xCode, il n’est plus necessaire de “release” nan ?!
Merci :p
oui normalement vous n’avez pas a mettre des release sauf dans le cas ou vous désactivez l’ARC (Automatic Reference Count).
Super merci Ulquiorra !
Donc sa nous enleve un lourd fardeau qui est present en language C
Je te souhaites une bonne journee !
Corentin.