none
Passer une méthode en argument d'un constructeur RRS feed

  • Question

  • Bonjour tout le monde!!

    Je voudrais savoir s'il est possible de passer une méthode en argument d'un constructeur. J'ai essayé avec un délégué mais je ne suis pas très à l'aise avec ca... et je n'ai pas réussi...

    L'objectif est de faire en sorte qu'une instance possédant un délégué en attribut puisse utiliser une méthode donnée au moment de sa construction, puis de l'appeler.

    Si je n'ai pas été assez clair, n'hésitez pas à me le dire, et si vous avez des idées aussi bien sûr ^^.

    Merci d'avance!!
    A plus!


    minimum, ca se tape assez naturellement d'une seule main.
    mardi 31 mai 2011 13:24

Réponses

  • En fait un délégué est un type (représentant une signature de méthode). Lorsque vous passer le nom d'une méthode au constructeur, en fait vous envoyer seulement l'adresse de celle-ci.
    Il est donc possible de créer une variable pour stocker la méthode à appeler (grâce au type du délégué), pour l'exécuter par la suite,
    Je suis reparti de votre exemple :

    namespace Test
    {
      static class Program
      {
        static void Main()
        {
          Robot monRobot1 = new Robot(Constructeur1);
          Robot monRobot2 = new Robot(Constructeur2);
    
          monRobot1.ExecuterAction();
          monRobot2.ExecuterAction();
    
          Console.WriteLine();
        }
    
        private static void Constructeur1()
        {
          Console.WriteLine("Je roule...");
        }
    
        private static void Constructeur2()
        {
          Console.WriteLine("J'avance...");
        }
      }
    
      public delegate void ActionRobot();
    
      public class Robot
      {
        private ActionRobot Action;
    
        public Robot(ActionRobot deleg)
        {
          Action = deleg;
        }
    
        public void ExecuterAction()
        {
          Action();
        }
      }
    }
    
    • Marqué comme réponse Minimum mercredi 1 juin 2011 07:43
    mardi 31 mai 2011 15:43

Toutes les réponses

  • Bonjour,

    L'idée du délégué fonctionne, voici un exemple : (désolé pour l'inspiration)

    namespace Test
    {
      static class Program
      {
        static void Main()
        {
          Personne maPersonne1 = new Personne(Constructeur1);
          Personne maPersonne2 = new Personne(Constructeur2);
    
          Console.WriteLine(maPersonne1.Nom + " / " + maPersonne1.Prenom);
          Console.WriteLine(maPersonne2.Nom + " / " + maPersonne2.Prenom);
    
          Console.WriteLine();
        }
    
        private static void Constructeur1(Personne _Personne)
        {
          _Personne.Nom = "Dupont";
          _Personne.Prenom = "Albert";
        }
    
        private static void Constructeur2(Personne _Personne)
        {
          _Personne.Nom = "Durand";
          _Personne.Prenom = "Marcel";
        }
      }
    
      public delegate void PersonneConstructeurInvoker(Personne _Personne);
    
      public class Personne
      {
        public string Nom;
    
        public string Prenom;
    
        public Personne(PersonneConstructeurInvoker _Initialiser)
        {
          _Initialiser.Invoke(this);
        }
      }
    }
    

    En espérant t'aider,

    mardi 31 mai 2011 14:33
  • Merci, ca m'aide déjà à mieux comprendre comment fonctionne un délégué, mais mon but est en fait de stocker la méthode pour pouvoir la rappeler plus tard à partir de l'instance.

    Je donne un exemple pour que ce soit plus clair :
    On a un robot pour qui on choisit à la construction l'action qu'il peut faire : taper avec un marteau, lancer un objet ou retourner un objet (vive l'exemple).
    Cependant, une fois construit, il ne peut plus faire d'autre action que celle choisie au départ et chacune de ces actions aura des conséquences différentes, ici respectivement casser quelque chose, déplacer (faute de mieux) l'objet et ... ben le retournement de l'objet.

    Je voudrais donc que l'instance de robot effectue son action et utilise la bonne méthode lorsqu'on utilise le délégué...

    Bon, j'ai eu une idée pendant que je tapais mon message, je l'écris ci-dessous :

    public delegate void del();
    public class Robot
    {
        public delegate void Action();

        public Robot(del deleg)
        {
            Action = deleg;
        }
    }

    Cela pourrait-il fonctionner?


    minimum, ca se tape assez naturellement d'une seule main.
    • Modifié Minimum mardi 31 mai 2011 15:24 j'ai tenté de mettre des \t pour les tabulations...
    mardi 31 mai 2011 15:23
  • En fait un délégué est un type (représentant une signature de méthode). Lorsque vous passer le nom d'une méthode au constructeur, en fait vous envoyer seulement l'adresse de celle-ci.
    Il est donc possible de créer une variable pour stocker la méthode à appeler (grâce au type du délégué), pour l'exécuter par la suite,
    Je suis reparti de votre exemple :

    namespace Test
    {
      static class Program
      {
        static void Main()
        {
          Robot monRobot1 = new Robot(Constructeur1);
          Robot monRobot2 = new Robot(Constructeur2);
    
          monRobot1.ExecuterAction();
          monRobot2.ExecuterAction();
    
          Console.WriteLine();
        }
    
        private static void Constructeur1()
        {
          Console.WriteLine("Je roule...");
        }
    
        private static void Constructeur2()
        {
          Console.WriteLine("J'avance...");
        }
      }
    
      public delegate void ActionRobot();
    
      public class Robot
      {
        private ActionRobot Action;
    
        public Robot(ActionRobot deleg)
        {
          Action = deleg;
        }
    
        public void ExecuterAction()
        {
          Action();
        }
      }
    }
    
    • Marqué comme réponse Minimum mercredi 1 juin 2011 07:43
    mardi 31 mai 2011 15:43
  • Merci pour l'explication, c'est parfait. Je n'avais pas compris qu'on obtenait un type, je croyais que c'était directement un délégué.

    Bonne journée!


    minimum, ca se tape assez naturellement d'une seule main.
    mercredi 1 juin 2011 07:50