Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1355 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] Delegate générique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C#] Delegate générique

n°1935082
Stnaire
Posté le 24-10-2009 à 14:44:30  profilanswer
 

Bonjour,
 
Je reviens a la charge pour une question de plus sur la généricité en C#, je penses que c'est la dernière :p
 
Voici le contexte :
 
J'ai créé 2 classes pour ce test unitaire :
- GenericCallbacks :
Elle stock un pointeur de méthode et l'appel quand on lui demande.
 
- TestDelegate :
Elle crée des GenericCallbacks ainsi que les méthodes de test a attacher aux delegates.
 
Voici le code complet compilable, j'exposerai le problème après :
 
GenericCallbacks :  

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace TestGenericDelegate
  6. {
  7.     class GenericCallbacks
  8.     {
  9.         private Delegate action;
  10.         private int x;
  11.         private int y;
  12.         public delegate void Callback();
  13.         public delegate void Callback2(int x, int y);
  14.         /*
  15.          * [...]
  16.          * Un grand nombre de delegate au prototypage different
  17.          * Pas tres propre..
  18.          */
  19.         public GenericCallbacks(Delegate Action)
  20.         {
  21.             this.action = Action;
  22.             this.x = this.y = 0;
  23.         }
  24.     //    public GenericCallbacks(Callback2 Action)
  25.      //   {
  26.      //       this.action = Action;
  27.      //       this.x = this.y = 5;
  28.      //   }
  29.         public void Invoke()
  30.         {
  31.             /* Apres diverses operations sur x et y j'ai moyen de savoir en quoi caster */
  32.             if (this.x != 0 && this.y != 0)
  33.             {
  34.                 ((Callback2)action).Invoke(x, y);
  35.             }
  36.             else
  37.             {
  38.                 ((Callback)action).Invoke();
  39.             }
  40.         }
  41.     }
  42. }


 
TestDelegate :  

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace TestGenericDelegate
  6. {
  7.     class TestDelegate
  8.     {
  9.         public void Method1()
  10.         {
  11.             Console.WriteLine("Method 1." );
  12.             return;
  13.         }
  14.         public void Method2(int x, int y)
  15.         {
  16.             Console.WriteLine("Method 2 : {0}, {1}.", x, y);
  17.             return;
  18.         }
  19.         public TestDelegate()
  20.         {
  21.             GenericCallbacks unitTest = new GenericCallbacks(Method1);
  22.             GenericCallbacks unitTest2 = new GenericCallbacks(Method2);
  23.             unitTest.Invoke();
  24.             unitTest2.Invoke();
  25.         }
  26.     }
  27. }


 
Un main de test :  

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace TestGenericDelegate
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             TestDelegate testDelegate = new TestDelegate();
  12.             Console.ReadKey(true);
  13.         }
  14.     }
  15. }


 
La problématique est la suivante :
Comment éviter de créer autant de constructeurs que de type de delegate dans la classe GenericCallbacks ?
 
Dans l'exemple je n'en ai que 2, mais dans le vrai programme qui me pose soucis j'en ai environ 10, en sachant que j'ai 1 surcharges pour chacun des types de delegates ce qui donne 20 surcharge de la même méthode d'ajout !
 
Dans mon cas, même si c'est moche, ca peut marcher, mais je n'ose pas imaginer le développeur qui se retrouve avec 250 prototypes possibles pour ses delegates.
 
J'ai essaye de faire prendre au constructeur un type System.Delegate mais ca ne fonctionne pas.
J'ai beau chercher un type générique capable de contenir un pointeur sur méthode mais je n'en trouve pas.
 
Voila, merci pour votre aide !


Message édité par Stnaire le 24-10-2009 à 14:45:01
mood
Publicité
Posté le 24-10-2009 à 14:44:30  profilanswer
 

n°1935093
theshockwa​ve
I work at a firm named Koslow
Posté le 24-10-2009 à 15:17:44  profilanswer
 

ca fait longtemps que je n'ai pas touché à C#, mais j'ai vraiment du mal à comprendre dans quel cas tu peux vouloir abstraire le prototype de tes delegates


---------------
last.fm
n°1935251
Stnaire
Posté le 25-10-2009 à 16:31:25  profilanswer
 

Salut,
 
Merci pour ta réponse, je ne connaissais pas ces techniques très pratiques.
 
En revanche, pour ce qui est du but de la manœuvre c'est simplement d'éviter de déclarer 1 méthode par delegate.
 
Dans mon cas c'est pour l'ajout d'un contrôle, et je me retrouve avec des méthodes du genre :  
 

Code :
  1. public void AddControl(string Name, Keys Keys, EmptyCallback Action, bool KeyRepeat);


 
"EmptyCallback" et un type void(); mais j'ai plusieurs autres delegate differentes.
Je fais aussi des surcharge de cette methode (AddControl) pour pouvoir prendre un tableau de Keys.
 
Je me retrouve donc avec 2 méthodes AddControl par type de delegate.
Avec 10 types de delegate par exemple, je vous laisse imaginer le carnage ...
 
Je cherche simplement a clarifier le code car la je trouve ca très sale.
 
Autrement la technique de déclaration présentée par Fred82 est intéressante mais, le fait de mettre ses attributs en public n'est pas contraire au concept objet ? (encapsulation tout ca)
 
Merci pour votre aide !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] Delegate générique

 

Sujets relatifs
[C#] Classes génériques, réflexionTexte en couleur (console)
Arguments en C[C++][Gtkmm] Récupérer la ligne sélectionnée d'un TreeView
[C#] Connexion server BO - Crystal ReportC Généricité
listes C[C++/Makefile] Compilation sous windows
[C] pb pour passer une matrice en parametre d'un fonctionInterface ADA avec C
Plus de sujets relatifs à : [C#] Delegate générique


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR