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. Voir https://dotnetfiddle.net/QsMTSZ pour une version en ligne.

L'interface ITransformateur, 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 ITransformateur<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. 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;

AfficheurConsole<string> aff = new ();
Coupler(aff, "coucou");
// méthodes de classe ou méthodes d'instance, peu importe
Coupler(aff, ChaîneTransfos(Enrober, aff.Majuscules, "coucou"));

static string Coupler(ITransformateur<string> trans, string msg) =>
   Coupleur.Coupler(trans, msg);

static string Enrober(string msg) =>
   $"({msg})";

static T ChaîneTransfos<T>(Opération<T> op0, Opération<T> op1, T obj) =>
   op0(op1(obj));

interface ITransformateur<T>
{
   T Appliquer(T obj);
}
static class Coupleur
{
   public static T Coupler<T>(ITransformateur<T> trans, T obj) =>
      trans.Appliquer(obj);
}
public delegate T Opération<T>(T obj);
public class AfficheurConsole<T> : ITransformateur<T>
{
   public T Appliquer(T obj)
   {
      Console.WriteLine(obj);
      return obj;
   }
   public string Majuscules(string s) =>
      s.ToUpper();
}

Lectures complémentaires

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


Valid XHTML 1.0 Transitional

CSS Valide !