Quel est l'équivalent des méthodes protégées en Objective-C? Je veux définir des méthodes que seules les classes dérivées peuvent appeler / implémenter.
objective-c
LK.
la source
la source
Vous pouvez simuler un accès protégé et privé aux méthodes en procédant comme suit:
Ces protections ne sont pas, comme Sachin l'a noté, appliquées à l'exécution (comme elles le sont en Java, par exemple).
la source
UIGestureRecognizerSubclass.h
Voici ce que j'ai fait pour que les méthodes protégées soient visibles par mes sous-classes, sans leur demander d'implémenter les méthodes elles-mêmes. Cela signifiait que je n'ai pas reçu d'avertissements du compilateur dans ma sous-classe concernant une implémentation incomplète.
SuperClassProtectedMethods.h (fichier de protocole):
SuperClass.m: (le compilateur va maintenant vous forcer à ajouter des méthodes protégées)
SubClass.m:
la source
performSelector
dessus.[(id)obj hiddenMethod]
. En disant avec précision, la méthode protégée n'est pas prise en charge dans Objective-C.Je viens de découvrir cela et cela fonctionne pour moi.Pour améliorer la réponse d'Adam, dans votre superclasse, faites une implémentation de la méthode protégée dans le fichier .m mais ne la déclarez pas dans le fichier .h. Dans votre sous-classe, créez une nouvelle catégorie dans votre fichier .m avec la déclaration de la méthode protégée de la superclasse et vous pouvez utiliser la méthode protégée de la superclasse dans votre sous-classe. Cela n'empêchera finalement pas l'appelant de la méthode supposée protégée si elle est forcée au moment de l'exécution.
la source
protectedMethod
Une autre façon d'utiliser les variables @protected.
la source
Vous pouvez définir la méthode en tant que méthode privée de la classe parent et l'utiliser
[super performSelector:@selector(privateMethod)];
dans la classe enfant.la source
Vous pouvez en quelque sorte le faire avec une catégorie.
Les méthodes ne sont pas masquées si vous importez la catégorie dans une autre classe, mais vous ne le faites pas. En raison de la nature dynamique d'Objective-C, il est en fait impossible de masquer complètement une méthode quel que soit le type d'instance appelante.
La meilleure façon de procéder est probablement la catégorie de continuation de classe à laquelle a répondu @Brian Westphal, mais vous devrez redéfinir la méthode dans cette catégorie pour chaque instance sous-classée.
la source
Une option consiste à utiliser l' extension de classe pour masquer les méthodes.
Dans
.h
:Dans
.m
:la source
@interface
déclaration dans le fichier .m. Vous pouvez simplement déclarer une fonction et l'utiliser et elle la traitera comme privée.Je nomme généralement la méthode protégée avec un préfixe interne:
la source