[C#] Delegate générique

Delegate générique [C#] - C#/.NET managed - Programmation

Marsh Posté le 24-10-2009 à 14:44:30    

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
Reply

Marsh Posté le 24-10-2009 à 14:44:30   

Reply

Marsh Posté le 24-10-2009 à 15:17:44    

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
Reply

Marsh Posté le 25-10-2009 à 16:31:25    

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 !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed