Mettre en œuvre une méthode virtuelle pure en Objective-C
Je veux aller là-bas. Mais plus sérieusement, comment peut-on mettre en œuvre une méthode virtuelle pure dans une "Pomme" de la sorte? Utilisez-vous un Protocole avec votre classe de base et de lancer des exceptions à ces méthodes?
- C'est une bonne question pour les gens à venir à partir d'une forte OO C++ arrière-plan.
Vous devez vous connecter pour publier un commentaire.
Quand vous programme en Objective-C, il faut purger votre esprit de choses telles que des méthodes virtuelles. Vous n'avez pas appeler des méthodes sur Objective-C d'objets, de vous envoyer des messages. Les objets de répondre à des messages ou ils ne le font pas, mais en raison de la liaison dynamique, vous ne pouvez pas dire ce jusqu'à l'exécution.
Ainsi, vous pouvez déclarer une méthode sur un objet de base et non pas de fournir une implémentation, pas de problème (sauf pour l'avertissement du compilateur), mais vous ne pouvez pas avoir le compilateur drapeau lorsque vous instancier directement un objet avec de telles méthodes, et il ne va pas faire une erreur à l'exécution, à moins que vous envoyer ce message à l'objet.
La meilleure façon de créer des "virtuel" des classes de base (à mon avis) est de déclarer la méthode et de lui donner un talon de mise en œuvre qui lève une exception appropriée.
En Objective-C, il n'y a pas de pur soutien virtuel comme en C++.
Une simulation serait que vous déclarez une méthode dans votre interface, mais ne pas la mettre en œuvre dans votre .m de fichier. Bien sûr, vous obtiendrez les avertissements du compilateur, mais autant que je me souvienne, vous pouvez transformer ces off. Mais vous ne pouvez pas obtenir des avertissements/erreurs si vous n'avez pas les écraser dans la sous-classe, que vous pouvez obtenir en C++ (IIRC).
Une autre solution serait de les mettre en œuvre avec juste un
NSAssert(NO, @"Subclasses need to overwrite this method");
corps. Encore, vous ne l'intercepter au moment de l'exécution, ne compile-time.NSAssert
partie.En fonction de ce que vous faites le délégué modèle peut être plus appropriée qu'une sous-classe, où le délégué est défini comme
id<YourDelegateProtocol>
. Le compilateur va générer une alerte si les méthodes requises dans le délégué du protocole ne sont pas mises en œuvre.Sous-classement est généralement à éviter en Objective-C dès lors que des objets ne peuvent pas hériter de plusieurs super-classes, mais ils peuvent mettre en œuvre des protocoles multiples.
Vous devez utiliser l':
Comme indiqué par Apple, ici: https://developer.apple.com/library/mac/#documentation/cocoa/reference/Foundation/Classes/NSObject_Class/Reference/Reference.html
Vous avez un peu d'options, mais vous êtes sur la bonne voie.
ObjC ne prend pas en charge directement, forçant les sous-classes pour mettre en œuvre un protocole est le meilleur moyen de le vérifier lors de la compilation.
'Secrètement" la mise en œuvre de la méthode dans la classe de base et de l'affirmation est ce que je fais pour confirmer la subclasser a sous-classé correctement lors de l'exécution. Certaines personnes ont des sentiments mitigés au sujet des assertions, ou doivent quitter leur actif, ce qui n'est pas toujours une bonne solution.
Vous pouvez également forcer les sous-classes utiliser un constructeur de classe et de séquence d'initialisation, puis de vérifier qu'elles ont mis en œuvre tout ce qui est nécessaire, avant de retourner une instance, dans le cas des avertissements du compilateur de ne pas le couper.
Mais ObjC manque un peu de lang fonctionnalités qui permettent aux clients de tirer eux-mêmes dans le pied, ou une solution de contournement de ce qu'ils souhaitent... vous ne devriez pas avoir trop collé sur l'appliquer.
remarque: les Exceptions sont très rares (et un peu dangereux, trop) en ObjC.
Une méthode virtuelle est une méthode dont le comportement peut être redéfinie dans une classe qui hérite d'une fonction avec la même signature (j'.e même nom avec le même nombre de paramètres et le type de paramètres).
Exemple:-
////////////////////////////////////////////////////
De sortie:-
"Il n'y a pas de mot-clé "Virtual" en Objective C."