Vidéo: Programmer en Swift #15 - La POO (6) - Les protocoles 2024
Un protocole définit des ensembles de méthodes pouvant être implémentés par n'importe quelle classe pour les applications iOS. Considérez les protocoles comme des interfaces de définition que les classes doivent implémenter. Les protocoles sont souvent utilisés pour spécifier l'interface pour les objets délégués. Avec la fonction de protocole, vous pouvez éviter d'avoir à forcer le sous-classement afin de créer des classes polymorphes.
Objective-C (contrairement à C ++) ne permet pas à une classe d'avoir plusieurs superclasses. Les protocoles sont donc une caractéristique essentielle d'Objective-C car ils ne permettent pas l'héritage multiple. Lorsqu'une classe implémente les méthodes dans un protocole, la classe est dite conforme au protocole.
La définition d'un protocole est similaire à la définition d'une interface pour une classe. Cependant, un protocole n'a pas de classe parente ou de variables d'instance. Voici un exemple de définition de protocole (imprimable) à partir du programme de calcul de postfix:
@protocol Printable - (void) printMe; // Je peux omettre @required, puisqu'il s'agit de la valeur par défaut @optional - (NSString *) printMeToString; -d
Avec l'arrivée (et même en grande fanfare) d'Objective-C 2. 0, les méthodes protocolaires peuvent être requises (par défaut) ou optionnelles. J'ai donc jeté ces directives du compilateur dans le mélange ici aussi.
Voici la déclaration du StackOfInteger indiquant qu'il implémentera le protocole:
@interface StackOfInteger: NSObject … -d
Voici l'implémentation du protocole dans la classe StackOfInteger:
@implementation StackOfInteger; … Autres méthodes StackOfInteger … /////////// Méthodes pour implémenter le protocole imprimable //////////// - (void) printMe {int k, pileCount = [nombre d'éléments]; NSLog (@ "Stack-> Last>% dlast); for (k = 0; k% @Vous pouvez implémenter la méthode printMeToString mais elle est facultative.
Un programme peut tester si un objet est conforme à un protocole Le code suivant contient des exemples de ce test (tiré du programme principal de l'échantillon):
printf ("Test de conformité aux protocoles"); if ([myStack conformeToProtocol: @protocole (Imprimable)]) {printf ("Utilisation des méthodes protocolaires"); [myStack printMe];} else {NSLog (@ "L'objet n'est pas conforme au protocole% @ n", @protocol (Imprimable));} id someObject = [[PostfixCalculator alloc] initWithExpression: @ "44 55 *"]; if (! [SomeObject conformeProtocole: @protocole (imprimable)]) {NSLog (@ "L'objet n'est pas conforme au protocole");}Comme l'objet myStack est conforme au protocole, ses méthodes printMe et printMeToString sont appelées.Puisque someObject (qui est de type id pour rendre l'exemple plus significatif) n'est pas conforme au protocole Printable, le test de conformité échoue.
Vous pouvez également tester l'existence d'une méthode optionnelle en utilisant la méthode respondsToSelector.
Vous pouvez faire en sorte qu'une classe adopte un protocole simplement en implémentant les méthodes définies par ce protocole. Autrement dit, vous n'avez pas à déclarer le protocole dans son interface. Cependant, même si la classe implémente les méthodes de protocoles, elle ne sera pas conforme au protocole et échouera au test de conformité précédent.