Protocoles et variables

fouffouf Membre
Alors, voila, il était une fois un petit fouf  :fouf):(oui oui, c'est bien moi) qui avait de décider de faire un programme modulaire avec un protocol jusqu'au jour où il se rendit compte que ca serait super si il pouvait ajouter une variable de classe à  son protocole. Il savait bien que s'il passait par une classe abstraite, cela aurait marché, mais il avait pas envie de réécrire une bonne douzaine de méthode pour cela.

Donc, il eut la bonne idée de demander sur le forum Objective-Cocoa.org s'il est possible de rajouter une "variable de classe" à  un protocole.

.... et il vecut heureux et eu beaucoup de softs :P

Réponses

  • 14:13 modifié #2
    Ce que tu demandes est impossible, le principe du protocole étant juste de garantir qu'une classe réponde à  une série de messages, indépendamment de son origine dans la hiérarchie des classes. Ce que tu peux faire par contre c'est ajouter une méthode dans le protocole qui renvoie l'objet considéré, et au lieu d'appeler la variable par son nom dans l'implémentation, tu l'appelles avec [self maVariable].

    Par contre, si tu rajoutes une variable dans une classe abstraite, elle perd sa qualité de classe abstraite.
  • GenoseGenose Membre
    août 2005 modifié #3
    salut,

    voyons voir si j'ai ben compris, car asteur( c'est du patois)  j'ai une idée là  dessus.
    Prenons une class Nsobject appelé Tilleul, et une class nsobject Arbre.
    Maintenant disons que Tilleul, est une instance Arbre dans ses variables d'instance et une catégorie Arbre. Puis-je récupérer une varaible d'instaace de Arbre sans  interférer avec la catégorie Arbre de Tilleul, item avec les appels de méthode de Arbre dans Tilleul,

    Maintenant allons plus loin en créant une deuxèime class nsobject  Cerisier et avec une catégorie Arbre elle aussi, même cas mais en plus es-ce que je peut récuperer la variable Arbre dans Tilleul, depuis  Cerisier et puis-je appeler une  méhtode Arbre dans Tilleul, depuis Cerisier sans avoir les shared instance en static pour Arbre


    arbre
    {

    -(id)feuille
    {
    return mesfeuillestype
    }

    }
    ****************
    [Tilleul, arbre];
    [Tilleul, feuilletype];
    ****************
    depuis cerisier
    feuillearbrevoisin= [Tilleul, feuille];
    ****************

    j'avais déja entendu parler des categorie mais les l'utiliser  semble être autre chose
  • août 2005 modifié #4
    Pour information, un clavier d'ordinateur dispose d'une touche 'Majuscule', ainsi que de touches permettant d'écrire ce qu'on appelle en français des "symboles de ponctuations", et également, pour les claviers français, de touches permettant d'écrire des lettres accentuées. Les navigateurs récents disposent également d'un outil nommé 'vérification d'orthographe'.

    Si tu ne connais pas cela, je t'invite à  consulter les références suivantes:
    Pour la ponctuation: http://fr.wikipedia.org/wiki/Ponctuation
    Pour les majuscules: http://fr.wikipedia.org/wiki/Majuscule
    Pour le vérificateur d'orthographe: je te conseille de consulter l'aide de ton navigateur

    Voilà , maintenant que tu as les références, il ne te reste plus qu'à  les apprendre, et à  les appliquer pour les assimiler.
  • GenoseGenose Membre
    14:13 modifié #5
    sans commentazire, face a ton sinismes
  • août 2005 modifié #6
    On t'a déjà  fait plusieurs remarques à  ce sujet (sur le forum et par messages privés), et tu y as répondu, je peux donc raisonnablement supposer que tu en as pris connaissance...

    Maintenant libre à  toi de ne pas en tenir compte, mais libre à  moi de te le faire remarquer.

    Et si tu trouves que je te manque de respect, sache que je trouve que tu manques sérieusement de respect vis-à -vis des gens à  qui tu demandes quelque chose, et qui vont prendre de leur temps libre pour répondre à  ta question.
  • 14:13 modifié #7
    dans 1124225525:

    sans commentazire, face a ton sinismes


    Sans commentaire(s), face à  ton cynisme.
  • août 2005 modifié #8
    Le vrai Bernard Pivot ?

    Non, je n'avais pas tout lu...

    Bein j'en sais rien après tout, tu m'en pose des questions...
  • août 2005 modifié #9
    dans 1124223910:

    Salut,

    Voyons voir si j'ai bien compris, car à  cette heure j'ai une idée la dessus.

    Prenons une classe NSObject appelée tilleul, et une classe NSObject arbre.



    Bigre, je n'ai jamais eu autant de travail, je vais devoir me constituer une équipe de grammairiens et d'académiciens.
  • GenoseGenose Membre
    14:13 modifié #10
    pas du tout , je sais bien que j'ai tendance à  ne pas mettre de ponctuations, mais j'ai lu pire.

    je parle correctement et m'exprime gentillement même pour des remarques un peut deplacé, mais s'il  faut que mes messages soit sans fautes de ponctuations, alors qu'on peut les comprendre  comme telles?! c'est juste et en même temps je me pose parfois des questions si ce n'est pas ciblé contre moi, mais bon;
    je dirais aussi que,  j'ai bien grace à  ici, appris le Cocoa et je vous en remercient d'ailleur, je ne cherche pas la 'provoque' et je préfère terminer et apprendre d'avantage dans ce  forum, mais j'ai deja eu ce genre remarque qui ont une tendance a forger une 'attention collective ciblé particulière'
    voilla tout.

    je ne force personne,  meme avec mon caractere mefiant et directoire.
  • muqaddarmuqaddar Administrateur
    14:13 modifié #11
    Disons que "asteur" à  la place de "à  cette heure", c'est pas de la ponctuation... ;)

    Et je n'avais pas compris que tu parlais de tilleul aussi, mais Bernard m'a éclairé !
  • BruBru Membre
    14:13 modifié #12
    Ecoute, Genose, je ne fais pas partie de ceux qui ont pu te faire des remarques...

    Mais ce soir, j'ai abandonné la lecture de ton message au bout de 3 lignes.

    Ce n'est pas la ponctuation qui est en cause, mais surtout les fautes de frappe.

    Je ne critique pas la "mauvaise orthographe" : ça peut se soigner.

    Par contre, ne pas se relire pour corriger les fautes de frappe (qui transforment "à  cette heure" en "asteur"), je suis désolé, mais moi, ce ne m'incite pas à  t'aider. Tout au plus, ça me montre le peu d'intérêt  que tu portes à  ta question et donc à  nos réponses.

    .
  • août 2005 modifié #13
    Il y a comprendre et comprendre.

    Tu arrives peut être à  comprendre directement des messages écrits de cette manière sans les déchiffrer, mais ce n'est pas le cas de tout le monde. Et pas le mien en tout cas, du moins sans faire "d'analyse". Tu poses des questions techniques, en toute logique tu devrais faire en sorte que les personnes à  qui tu poses les questions puissent se focaliser sur la question, et pas sur la compréhension de la question.

    Alors non, il ne faut pas que les messages soient écrits sans fautes, mais un minimum de soin doit être apporté. Ce qui n'est pas le cas de beaucoup de tes messages. Surtout que tu sais que certains d'entre nous qui pourraient t'apporter une réponse sont assez chatouilleux là  dessus.
  • muqaddarmuqaddar Administrateur
    14:13 modifié #14
    Bon bein tout est dit.

    Ce que je propose maintenant à  Genose :

    1) Tu repostes un message compréhensible. :)
    2) On se fera une joie de répondre parce qu'on est gentil ! ;)
  • GenoseGenose Membre
    14:13 modifié #15
    :( bon ok, dommage, les langues suporté sont donc:

    - le français
    et le français

    pas d'argot et de langues régionales.

    désolé.

    j'va tanto fouiné une gayette qui dictero l'instruction dem caboche.

    j'vais m'appliquer alors. ;) :fouf):
  • GenoseGenose Membre
    14:13 modifié #16
    merci pour votre gentillesse.

    j'ai corrigé nombres de mes fautes
  • muqaddarmuqaddar Administrateur
    14:13 modifié #17
    dans 1124229585:

    merci pour votre gentillesse.

    j'ai corrigé nombres de mes fautes


    C'est bien !
    On ne t'empêche pas d'écrire en patois si ça te fait plaisir, mais tu mets la traduction en Français au dessous... mais il vaut mieux que tu te concentres sur un Français sans faute à  mon avis.

    Béco goret !
  • Eddy58Eddy58 Membre
    14:13 modifié #18
    ;D

    [Fichier joint supprimé par l'administrateur]
  • muqaddarmuqaddar Administrateur
    14:13 modifié #19
    J'avais déjà  vu cela, c'est édifiant.

    Mais bon, comme c'est écrit, il faut la première et dernière lettre à  la bonne place...
  • GenoseGenose Membre
    14:13 modifié #20
    merci à  tous,
    maintenant qu'on à  trés longuement égaré le sujet, pourrait on y revenir  svp.

    si quelqu'un à  une réponse à  ma question sur les catégorie croisé avec une instance dans la mémé classe (class in UK), je crois que ce serait sympa et profitable et à   plus d'un qui souhaite mettre en pratique  ce genre de croissement et aussi mettre des catégoories dans leurs classes.

    ou alors un tutos sur les catégories.

    merci
  • odjauodjau Membre
    14:13 modifié #21
    Pour ce qui est des tutos sur les catégories tu as ceci ou cela. Par contre c'est en anglais  :(
  • fouffouf Membre
    14:13 modifié #22
    en fait, je ne comprends pas trop ce que tu cherches à  faire.
    Voila ce que j'ai compris :
    Tu as deux sous-classes de NSObject : Tilleul et Arbre et une catégorie de Arbre : Cerisier. C'est bien cela ?
    Pourrais-tu nous réexpliquer.

    A première vue, ce que j'aurais fais, c'est la chose suivante :
    une classe (abstraite) Arbre avec les sous-classes Tilleuil et Cerisier. Et ensuite un controlleur qui regarde quels sont les arbres côtes à  côtes et les feuilles qui se touchent. A la limite, si tu as une architecture qui fait que tu peux avoir des objets qui ressemblent à  des arbres (qui répondent aux mêmes méthodes) mais qui n'en sont pas, tu peux utiliser les protocoles qui te permettent de déclarer des méthodes sans les implémenter.

    Voili voilou (je sais pas si je suis HS ou pas, merci de me le dire ;))
  • BruBru Membre
    14:13 modifié #23
    dans 1124223910:

    salut,

    voyons voir si j'ai bien compris, car asteur( c'est du patois)  j'ai une idée là  dessus.
    Prenons une class Nsobject appelé Tilleul, et une class nsobject Arbre.
    Maintenant disons que Tilleul, aie une instance Arbre dans ses variables d'instance et une catégorie Arbre. Puis-je récupérer une variable d'instance de Arbre sans  interférer avec la catégorie Arbre de Tilleul, idem avec les appels de méthode de Arbre dans Tilleul,

    Maintenant allons plus loin en créant une deuxième class nsobject  Cerisier et avec une catégorie Arbre elle aussi, même cas mais en plus est-ce que je peux récuperer la variable Arbre dans Tilleul, depuis  Cerisier et puis-je appeler une  méhtode Arbre dans Tilleul, depuis Cerisier sans avoir les shared instance en static pour Arbre


    Une catégorie n'est qu'une manière "pratique" de regrouper des méthodes entre-elles en leur donnant un nom (de catégorie).
    L'utilisation d'une catégorie dans une classe n'impacte absolument rien (hormis la clarté du code...).

    Le protocole est une sorte de catégorie, en ce sens où plusieurs méthodes sont regroupées sous un nom de protocole.
    Par contre, l'utilisation d'un protocole dans une classe impose que toutes les méthodes qu'il regroupe soient implémentées dans ladite classe. Par ailleurs, la notion de protocole est enregistré dans le code de description de la classe, ce qui permet, au runtime, d'interroger les classes (méthode conformsToProtocol: de NSObject) afin de savoir si elles repondent bien à  un protocole donné.

    L'utilisation de catégorie a (pour moi) 1 avantage et 2 inconvénients.
    Le seul avantage (et il est de taille), c'est de pouvoir reprogrammer n'importe quelle méthode d'une classe, sans créer de sous-classe à  cette dernière.
    Les 2 inconvénients sont : ne pas pouvoir modifier les variables d'instance (il faut passer par une sous classe), et, ne pas pouvoir appeller l'ancien code de la méthode qu'on "surcharge" par la catégorie (même si une astuce découverte par Chacha pourrait permettre de le faire).

    Maintenant, dans ton exemple d'arbre, de tilleul et de cerisier, ce que tu évoques ne correspond pas aux catégories.
    Le fait d'avoir Arbre comme catégorie et comme variable d'instance ne pose pas de problème : tu ne peux manipuler que la variable d'instance. Dans ton programme, la notion de catégorie Arbre n'existe même pas.

    Pour le reste (le cerisier, etc.), ce ne sont pas les catégories qui vont t'aider. La réponse repose effectivement par les "shared instances" (en fait une implémentation du design pattern Singleton à  la sauce Apple). Ce n'est que de la prog. Alors à  ton clavier !

    .
  • GenoseGenose Membre
    août 2005 modifié #24
    Salut,

    j'ai glaner les articles sur les protocoles et les catégories, et j'en dirait qu'une chose:

    c'est vraiment un concept trop puissant pour être passé à  coté.

    grâce à  deux là  associés dans mon programme j'ai des SharedInstance en Stiatic (Singleton) qui ont disparus, mon code est devenu plus propre et ainsi mon appliation fonctionne mieux et plus rapidement, le bonheur totale.

    voyez-donc; j'avais ma class de Log  qui devait être connu de plusieurs autres class et une autre class qui devait aussi partager ses connaissances, et bien grâce aux deux compéres, j'ai une sous class comme je voulais qui répond aux autres class maitre (les instantiateurs) et qui permet de faire communiquer les instances entre elles bien mieux que avec des Singleton, qui dans mon cas m'embarasser plus qu'il n''été prévu (plus de code et de if).


    Merci à  :
    Bru, Odjau, Fouf



    peut etre un screenshot de mon appli en fonctionnement grace à  cette techinque.

    ps:

    avec catégorie combiné à  la puissance de protocole mon devellopement est plus blanc et les bugs tenace disparaissent. vous aussi adopter les . ;D

    lol ;D
  • fouffouf Membre
    14:13 modifié #25
    dans 1124367394:

    avec catégorie combiné à  la puissance de protocole mon devellopement est plus blanc et les bugs tenace disparaissent. vous aussi adopter les . ;D

    lol ;D


    C'est déjà  fait ;) :P
Connectez-vous ou Inscrivez-vous pour répondre.