Je veux aller là-bas. Sérieusement, comment peut-on implémenter une méthode virtuelle pure de manière "Apple"? Utilisez-vous un protocole avec votre classe de base et envoyez-vous des exceptions sur ces méthodes?
Réponses
Trop de publicités?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");
du corps. Encore, vous ne l'intercepter au moment de l'exécution, ne compile-time.
Selon ce que vous faites, le modèle de délégué peut être plus approprié qu'une sous-classe, où le délégué est défini comme id<YourDelegateProtocol>
. Le compilateur générera un avertissement si les méthodes requises dans le protocole de délégation ne sont pas implémentées.
Les sous-classes sont généralement évitées dans Objective-C car les objets ne peuvent pas hériter de plusieurs super-classes, mais ils peuvent implémenter plusieurs protocoles.
Vous devriez utiliser le:
- (void)doesNotRecognizeSelector:(SEL)aSelector method.
Comme l'a noté Apple, voici: 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.