C# – Délégués et généricité

Ceci est un exemple un peu abstrait illustrant les délégués (avec une touche de généricité) en C#. Vous pourrez comparer par vous-mêmes avec des programmes équivalents dans les langages que vous connaissez.

L'interface Transformateur, générique sur le type T, expose le service Appliquer() qui prend un T et retourne un T. Un exemple simple serait une fonction recevant un int et en retournant le cube.

La classe Coupleur n'est pas générique mais offre un service générique sur la base d'un type T capable de prendre un Transformateur<T> et d'invoquer sa méthode Appliquer() en lui passant un paramètre de type T.

Le type Opération est un délégué, donc une fonction polymorphique sur la base de sa signature. Remarquez sa forme : elle prend un T et retourne un T. Pour cette raison, elle pourrait remplacer la méthode d'instance Majuscules() d'un AfficheurConsole, tout comme elle pourrait remplacer la méthode de classe Enrober() de Program (ces deux classes apparaissent plus bas dans l'exemple). Notez qu'un délégué n'a pas à être générique; ici, je l'ai fait générique par pure déformation professionnelle.

Le programme principal montre comment il est possible d'utiliser des délégués pour enchaîner des opérations sur la base de leur signature, même si l'une est une méthode d'instance et l'autre est une méthode de classe.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ExempleDélégués
{
   public interface Transformateur<T>
   {
      T Appliquer(T obj);
   }
   public class Coupleur
   {
      public static T Coupler<T>(Transformateur<T> trans, T obj)
      {
         return trans.Appliquer(obj);
      }
   }
   public delegate T Opération<T>(T obj);
   public class AfficheurConsole<T>
      : Transformateur<T>
   {
      public T Appliquer(T obj)
      {
         Console.WriteLine(obj);
         return obj;
      }
      public string Majuscules(string s)
      {
         return s.ToUpper();
      }
   }
   class Program
   {
      public static string Coupler(Transformateur<string> trans, string msg)
      {
         return Coupleur.Coupler(trans, msg);
      }
      public static string Enrober(string msg)
      {
         return "(" + msg + ")";
      }
      public static T ChaîneTransfos<T>(Opération<T> op0, Opération<T> op1, T obj)
      {
         return op0(op1(obj));
      }
      static void Main(string[] args)
      {
         AfficheurConsole<string> aff = new AfficheurConsole<string>();
         Coupler(aff, "coucou");
         // méthodes de classe ou méthodes d'instance, peu importe
         Coupler(aff, ChaîneTransfos(Enrober, aff.Majuscules, "coucou"));
      }
   }
}

Lectures complémentaires

Pour d'autres liens portant sur les délégués :


Valid XHTML 1.0 Transitional

CSS Valide !