Comment puis-je fournir une implémentation par défaut pour un Objectif-C protocole?
J'aimerais préciser un Objectif-C protocole avec une option de routine. Lorsque la routine n'est pas implémentée par une classe conforme au protocole, je voudrais utiliser une valeur par défaut de la mise en œuvre à sa place. Est-il une place dans le protocole lui-même, où je peux définir ce défaut de mise en œuvre? Si non, quelle est la meilleure pratique pour réduire copier et coller ce défaut de mise en œuvre de tous les coins?
- Ce poste offre un cadre élégant, roman solution: utiliser une catégorie de NSObject. stackoverflow.com/questions/19329309/...
Vous devez vous connecter pour publier un commentaire.
Objective-C protocoles ont pas d'affordance pour les implémentations par défaut. Ils sont purement collections de déclarations de méthode qui peut être mis en œuvre par d'autres classes. La norme de pratique en Objective-C est de tester un objet lors de l'exécution pour voir si elle répond à l'sélecteur de donnée avant d'appeler cette méthode sur elle, l'aide -[NSObject respondsToSelector:]. Si e objet ne répond pas à le sélecteur de donnée, la méthode n'est pas appelée.
Une façon pour vous d'obtenir le résultat que vous recherchez consisterait à définir une méthode d'encapsulation le comportement par défaut que vous cherchez dans l'appel de la classe, et appeler cette méthode si l'objet ne passe pas le test.
Une autre approche serait de faire de la méthode sera requise dans le protocole, et de fournir des implémentations par défaut dans les super-classes de toutes les classes où vous ne voulez pas fournir une implémentation spécifique.
Il y a probablement d'autres options, mais en général il n'y a pas une norme de pratique en Objective-C, à l'exception peut-être tout simplement pas appeler la méthode donnée si elle n'a pas été mise en œuvre par l'objet, par mon premier paragraphe ci-dessus.
Il n'existe pas de méthode standard pour faire comme les protocoles ne devrait pas définir toutes les implémentations.
Depuis Objective-C est livré avec un pur moment de l'exécution, vous pouvez bien sûr ajouter un tel comportement si vous pensez vraiment que vous avez besoin de le faire de cette façon (et il n'y a pas de possibilité par la réalisation même de l'héritage).
Dire que vous avez déclaré MyProtocol, puis il suffit d'ajouter une interface avec le même nom dans le .h fichier dans votre protocole de déclaration:
Et la création d'un correspondant de la mise en œuvre de fichier (à l'aide de MAObjCRuntime pour des raisons de lisibilité ici, mais la norme d'exécution des fonctions ne serait pas beaucoup plus de code):
Ensuite vous avez juste à appeler
dans l'initialiseur de votre classe conforme au protocole et toutes les méthodes par défaut sera ajouté.
Vraiment fascinant façon est d'utiliser le moteur d'exécution. Lors de la mise en place, très tôt dans l'exécution d'un programme, procédez de la manière suivante:
Il peut être atteint sans trop de difficulté.
Comme Ryan mentionner il n'y a pas des implémentations par défaut pour les protocoles, une autre option pour la mise en œuvre dans la super-classe est de mettre en œuvre un "Gestionnaire" sorte de classe qui peuvent être contenus dans une catégorie qui souhaitent fournir l'implémentation par défaut, la méthode appropriée, puis appelle les gestionnaires par défaut de mise en œuvre.
J'ai fini par créer une macro qui a un défaut de mise en œuvre de la méthode.
J'ai défini dans le protocole de l'en-tête du fichier, et puis c'est juste un one-liner dans chaque application.
De cette façon, je n'ai pas à changer la mise en œuvre de plusieurs endroits, et c'est fait sur le temps de compilation, donc pas au moment de l'exécution de la magie est nécessaire.
Je suis d'accord avec "w.m." Une très belle solution est de mettre toutes les implémentations par défaut dans l'interface (avec le même nom que le protocole). Dans la partie "+d'initialiser la" méthode de la sous-classe, il suffit de copier tout, mis en oeuvre des méthodes de l'interface par défaut en lui-même.
La suite des fonctions d'assistance a fonctionné pour moi
Puis vous l'appelez dans votre classe d'initialiseur comme...
Xcode va vous donner des avertissements à propos de Foobar manquant méthodes, mais vous pouvez les ignorer.
Cette technique seulement des copies des méthodes, pas ivars. Si les méthodes sont l'accès aux données membres qui n'existent pas, vous pourriez obtenir des bugs étranges. Vous devez vous assurer que les données sont compatibles avec le code. C'est comme si vous avez un reinterpret_cast de Foobar pour MyProtocol.