Classe abstraite en objective-c

FloFlo Membre
13:46 modifié dans API AppKit #1
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

Réponses

  • AliGatorAliGator Membre, Modérateur
    13:46 modifié #2
    Rien n'empêche de créer des classes abstraites en Objective-C. Tu déclares tes méthodes dans le .h mais tu ne les implémentes pas. Aucun souci là  dessus.

    Quand aux classes interfaces, en Objective-C on appelle ça des protocoles. c'est expliqué ici
  • schlumschlum Membre
    avril 2008 modifié #3
    awakeFromNib est à  utiliser quand on a besoin de travailler sur les objets d'interface, afin d'être sûr qu'ils sont bien initialisés déjà .

    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.
  • schlumschlum Membre
    13:46 modifié #4
    dans 1209322553:

    Rien n'empêche de créer des classes abstraites en Objective-C. Tu déclares tes méthodes dans le .h mais tu ne les implémentes pas. Aucun souci là  dessus.


    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 ..."
  • FloFlo Membre
    13:46 modifié #5
    Salut,

    Tu déclares tes méthodes dans le .h mais tu ne les implémentes pas


    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 ?

    awakeFromNib est à  utiliser quand on a besoin de travailler sur les objets d'interface, afin d'être sûr qu'ils sont bien initialisés déjà .

    Ok, merci pile poil ce que j'avais besoin de savoir.

    Je préfère dans ce cas les implémenter et leur faire lever une exception du genre "Abstract class ...

    Pourrais-tu préciser le fond de ta pensé ?





  • schlumschlum Membre
    13:46 modifié #6
    Ben je fais ma classe normalement, et les méthodes que je veux "abstraites", je mets dedans quelque-chose du genre :

    [[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...)
  • FloFlo Membre
    13:46 modifié #7
    Ah ok je vois...

    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  ;)
  • AliGatorAliGator Membre, Modérateur
    13:46 modifié #8
    Ben de par l'aspect dynamique de Cocoa, rien n'empêche d'instancier une classe "abstraite" (pas totalement implémntée) au moment du runtime, puisqu'on peut définir les méthodes d'instance d'une classe au runtime aussi...

    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 ;)
Connectez-vous ou Inscrivez-vous pour répondre.