Différence entre @protocol et @interface?

2»

Réponses

  • mpergandmpergand Membre
    08:37 modifié #32
    dans 1235053007:

    En Java (et en C++), un " Protocole " est une classe (virtuelle).
    ...
    On peut simuler une classe virtuelle en Objective-C ; il suffit d'implémenter les méthodes " virtuelles " en balançant une exception.


    J'utiliserais le terme abstrait plutôt que virtuel.

    en ObjC toutes les méthodes sont virtuelles par défaut, mais il n'existe pas de méthodes abstraites, alors faut ruser...

    <br />-(void) maMethodeAbstraite<br />{<br />&nbsp; NSLog(@&quot;[%@: %s] must be implemented !&quot;,[self class],_cmd)<br />}<br />
    


    ça et les variables statiques, ObjC c'est un peu bricolo par moment  :(


  • schlumschlum Membre
    08:37 modifié #33
    Je suis plus violent  :) À la place du NSLog je préconisais un -[NSException raise]  :P
  • Philippe49Philippe49 Membre
    08:37 modifié #34
    dans 1235055190:

    ça et les variables statiques, ObjC c'est un peu bricolo par moment  :(


    Je crois surtout qu'il faut faire avec ce qu'il y a dans Objective C, et il y a beaucoup, sans essayer de simuler des ressources qu'il y a dans d'autres langages. Donc, comme le disait Schlum dans le post sur les variables statiques, faut se débrouiller autrement, et si on se rendait compte alors que c'est plus clair ... ?
  • mpergandmpergand Membre
    08:37 modifié #35
    dans 1235055630:

    Je suis plus violent  :) À la place du NSLog je préconisais un -[NSException raise]  :P


    suis non violent  :fouf):
  • mpergandmpergand Membre
    08:37 modifié #36
    dans 1235055792:

    dans 1235055190:

    ça et les variables statiques, ObjC c'est un peu bricolo par moment  :(

    Donc, comme le disait Schlum dans le post sur les variables statiques, faut se débrouiller autrement, et si on se rendait compte alors que c'est plus clair ... ?


    En C, C++, Java, ObjectiveC, j'utilise des variables statiques tout le temps, désolé  :P
  • GreensourceGreensource Membre
    08:37 modifié #37
    Tiens j'avais même pas fait gaffe qu'il n'y avais pas de variable statique. Ca doit être bien chiant du coup.
    Et c'est pareil tout à  l'heure je me demandais:
    "tiens mais c'est étrange il n'y a pas de public,private... pour les méthodes."
    Je sais bien que les attributs sont forcément private et c'est nickel comme ça, mais les méthodes du coup, comment on fait si on en veux une privé?
  • Philippe49Philippe49 Membre
    08:37 modifié #38
    dans 1235141812:

    Tiens j'avais même pas fait gaffe qu'il n'y avais pas de variable statique. Ca doit être bien chiant du coup.

    Le mot statique est utilisé dans des sens très divers selon les langages.
    Les variables statiques du C sont parfaitement utilisables en Objective-C, tout ce qui est C est utilisable en Objective-C.

    dans 1235141812:

    Et c'est pareil tout à  l'heure je me demandais:
    "tiens mais c'est étrange il n'y a pas de public,private... pour les méthodes."
    Je sais bien que les attributs sont forcément private et c'est nickel comme ça, mais les méthodes du coup, comment on fait si on en veux une privé?

    Voir les mots-clés @public , @private, @protected
    Franchement, je ne m'en suis jamais servi.
  • Philippe49Philippe49 Membre
    08:37 modifié #39
    Allez zou, un petit essai

    #import &lt;Foundation/Foundation.h&gt;<br />// le fichier .h<br />@interface ClassA :NSObject {<br />}<br />-(void) method;<br />-(void) biouit;<br />@end<br /><br />// le fichier .m<br />static NSInteger machin=0;<br />@implementation ClassA<br />-(void) method {<br />	static NSInteger truc=0;<br />	truc++;<br />	printf(&quot;truc=%ld&#092;n&quot;,truc);<br />}<br />-(void) biouit {<br />	machin++;<br />	printf(&quot;machin=%ld&#092;n&quot;,machin);<br />}<br />@end<br /><br />int main( int argc, char **argv )<br />{<br />	NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init];<br />	ClassA * a1=[[[ClassA alloc] init] autorelease];<br />	ClassA * a2=[[[ClassA alloc] init] autorelease];<br />	puts(&quot;Variable statique dans une méthode : Avec a1&quot;);<br />/* incrémentations */	<br />	[a1 method];	[a1 method];	[a1 method];<br />	puts(&quot;Variable statique dans une méthode : Avec a2&quot;);<br /><br />/* incrémentations */	<br />	[a2 method];[a2 method];<br />	puts(&quot;Variable statique globale : Avec a1 ou a2&quot;);	<br /><br />/* incrémentations */	<br />	[a1 biouit];	[a1 biouit];	[a2 biouit]; [a1 biouit];<br />	[pool drain];<br />	return (0);<br />} <br />
    



    Ce qui donne sur la console :

    % gcc pgm.m -o pgm -framework Foundation
    % pgm
    Variable statique dans une méthode : Avec a1
    truc=1
    truc=2
    truc=3
    Variable statique dans une méthode : Avec a2
    truc=4
    truc=5
    Variable statique de classe : Avec a1 ou a2
    machin=1
    machin=2
    machin=3
    machin=4
    %

  • CéroceCéroce Membre, Modérateur
    08:37 modifié #40
    dans 1235142534:

    Voir les mots-clés @public , @private, @protected
    Franchement, je ne m'en suis jamais servi.


    Tiens, moi non plus.
    Mes méthodes "protégées" commencent par un _ . On fait ainsi en Python, et je trouve cette autodiscipline moins contraignante que revenir dans le .h. Quant aux méthodes privées... je dois dire que je n'en saisis pas l'intérêt (sans doute parce que je n'ai jamais travaillé sur de très gros projets).
  • schlumschlum Membre
    08:37 modifié #41
    Je crois que les mots-clé @public @private @protected ne s'appliquent qu'aux variables, pas aux méthodes de toute manière.
    Et ça n'a pas vraiment la même définition qu'en Java / C++ vu qu'une classe ne peut pas dériver avec un de ces types d'une autre classe.

    @public -> accessible partout (comme pour une structure)
    @protected -> accessible que dans self et dans les objets de même classe, ou de classe dérivée... (mais il faut dans ce cas les caster)
    @private -> accessible que dans self et dans les objets de même classe
  • schlumschlum Membre
    08:37 modifié #42
    D'ailleurs, en fouinant dans Objective-C précis & concis pour trouver ces infos, je viens de tomber sur un truc qui nous ramène au sujet  :P

    @protocol(<;NomProtocole>) permet de déclarer un pointeur sur une instance de " classe " NomProtocole.
  • GreensourceGreensource Membre
    08:37 modifié #43
    Ah ouais? Bas je croyais qu'un protocol n'étais qu'un "protocole" justement, une règle qu'il fallait respecter et rien d'autre.
    Du coup je me demande comment ça marche et si c'est une bonne idée finallement d'utiliser ça.
  • schlumschlum Membre
    08:37 modifié #44
    dans 1235210259:

    Ah ouais? Bas je croyais qu'un protocol n'étais qu'un "protocole" justement, une règle qu'il fallait respecter et rien d'autre.
    Du coup je me demande comment ça marche et si c'est une bonne idée finallement d'utiliser ça.


    C'est une directive du compilateur... Je suppose que c'est transformé en quelque chose d'équivalent au niveau proc à  "id<NomProtocole>"  ;)
Connectez-vous ou Inscrivez-vous pour répondre.