Classe abstraite en objective-c
Flo
Membre
Bonjour,
Petite question de débutant, est-il possible en objective-c de définir des classes abstraites un peu comme en java?
Juste pour définir ce que j'appelle une classe abstraite : il s'agit d'une classe qui n'a pas d'instances et qui définit un certain nombre de méthodes que ses héritiers doivent implémenter.
Java permet également de créer des classes interfaces (close implements), est-il possible de faire ce genre de chose en objective-c ?
Pendant que j'y suis, je me demande dans quels cas vaut-il mieux utiliser init que awakeFromNib ? Je sais qu'init est appelé à l'instanciation de la classe et qu'awakeFromNib est appelé au décompactage du fichier NIB... Cependant, quand faut-il utiliser plutôt l'un que l'autre lorsque l'on souhaite paramétrer une classe ?
Merci d'avance de vos lumières et bonne fin de weekend. 8--)
Flo
Petite question de débutant, est-il possible en objective-c de définir des classes abstraites un peu comme en java?
Juste pour définir ce que j'appelle une classe abstraite : il s'agit d'une classe qui n'a pas d'instances et qui définit un certain nombre de méthodes que ses héritiers doivent implémenter.
Java permet également de créer des classes interfaces (close implements), est-il possible de faire ce genre de chose en objective-c ?
Pendant que j'y suis, je me demande dans quels cas vaut-il mieux utiliser init que awakeFromNib ? Je sais qu'init est appelé à l'instanciation de la classe et qu'awakeFromNib est appelé au décompactage du fichier NIB... Cependant, quand faut-il utiliser plutôt l'un que l'autre lorsque l'on souhaite paramétrer une classe ?
Merci d'avance de vos lumières et bonne fin de weekend. 8--)
Flo
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Quand aux classes interfaces, en Objective-C on appelle ça des protocoles. c'est expliqué ici
Par exemple, un "[myTextField setStringValue@"toto"]" sera à mettre dans un awakeFromNib, parce que au niveau du "init", myTextField ne sera probablement même pas connecté à l'interface.
Tout le reste est à mettre dans l'init.
Pas cool, ça donne deux Warnings "incomplete implementation of class 'MyClass'" et "method definition for '-myMethod' not found"
Je préfère dans ce cas les implémenter et leur faire lever une exception du genre "Abstract class ..."
Le truc c'est que le corps des méthodes abstraites doit pouvoir être défini dans la classe abstraite. Par exemple si je fais une classe abstraite Véhicule et que je définit une méthode allumerContact {insérerClé()}, et si je fais une classe Voiture et une classe Camion qui héritent de véhicule et ben je dois retrouver le corps de la méthode allumerContact() dans chacune d'elles. Par contre je ne pourrai pas instancier Véhicule directement.
Par définition, une classe abstraite contient des méthodes abstraites ayant un corps et/ou aucun corps. Existe-t-il ce genre d'outil avec objective-c ?
Ok, merci pile poil ce que j'avais besoin de savoir.
Pourrais-tu préciser le fond de ta pensé ?
[[NSException exceptionWithName:@AbstractClassException reason:@Class MyClass is abstract, operation not allowed userInfo:nil] raise];
Je ne pense pas qu'on puisse pousser plus loin le concept de classe abstraite en Objective-C (on pourra l'instancier directement...)
Un genre d'implémentation à la main du mécanisme qui empêche d'instancier directement la classe. Si je comprends bien il est impossible d'avoir une classe qui contient des méthodes vides et des méthodes complétées que l'on ne peut instancier directement et qui avertira le compilateur qu'une sous-classe n'implémente pas toutes les méthodes définies...
Et le problème d'un protocole c'est qu'il ne se rattache pas à une classe en particulier, on ne peut donc pas en hériter, bénéficier de méthodes héritées complétées et encore moins de variables d'instances héritées...
Dommage, un tel mécanisme m'est super utile quand je javate...
Merci du coup de main
Du coup c'est pas comme en C++ où demander à instancer une classe abstraite est impossible et donc provoque une erreur de compilation... puisqu'en Objective-C ça peut éventuellement avoir du sens