Objectives-C : les protocoles

Objective C | 6494 Vues

avril 4, 2012

delegation

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 icon biggrin Objectives C : les protocoles .
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

Objective-C
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

Objective-C
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

Objective-C
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.

 Objectives C : les protocoles

Touti

Saad Eloulladi a écrit 27 articles dans ce blog.

Comments

comments



3 Réponses Pour “Objectives-C : les protocoles”

  1. Corentin dit :

    Cool !

    Par contre une question, avec la nouvelle version de xCode, il n’est plus necessaire de “release” nan ?!

    Merci :p

    • Ulquiorra dit :

      oui normalement vous n’avez pas a mettre des release sauf dans le cas ou vous désactivez l’ARC (Automatic Reference Count).

      • Corentin dit :

        Super merci Ulquiorra !

        Donc sa nous enleve un lourd fardeau qui est present en language C :)

        Je te souhaites une bonne journee !

        Corentin.

Laisser un Commentaire