Blog sur les technos .net
Puisque ces mystères me dépassent, feignons d'en être l'organisateur.

[.NET] Etes vous CoVariance ou ContraVariance avec les délégués ?

By TheGrandBlack

Trève de jeu de mots.
Savez que .NET 2.0 ( version 2005 nom de code WhidBey ) a introduit la notion de Covariance et de ContraVariance au niveau des délégués ( delegate ).
Qui n'a pas eu besoin un jour, de Covariance et de ContraVariance dans les délégués ?

Ne répondez pas tous en même temps.
Bon, je vois qu'il y a des timides; je vais au risque de vous apprendre quelque chose que vous savez déja, vous donnez une petite explication :

CoVariance
La notion de covariance implique la valeur renvoyée par un délégué.
Remontons un peu dans le temps c'est à dire dans la version 1.x de .NET, et regardons le fonctionnnement des delegate.
Pour cela je vais prendre 2 classes :
- Une classe Parente
- Une classe Fille

Mettons en place, 2 délégués, renvoyant une instance de Parente et une instance de fille.



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

namespace Net.Gavarin
{
public delegate Parente ParenteEventHandler();
}

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

namespace Net.Gavarin
{
public delegate Fille EnfantEventHandler();
}

En .net 1.x il n'est pas possible d'affecter au délégué "ParenteEventHandler" une méthode renvoyant un ancetre de Parent. L'exemple suivant ne fonctionne pas :




static Parente GetParente()
{
return new Parente();
}

static Enfant GetEnfant()
{
return new Enfant();
}
static void Main(string[] args)
{
ParenteEventHandler A = new ParenteEventHandler(GetEnfant);
}


Mais en .NET 2.0 avec la notion de CoVariance c'est correct et cela fonctionne.
ContraVariance

Le mécanisme de contravariance est tres proche de ce qu'on vient de voir, sauf que cela ne s'applique pas à la valeur renvoyée, mais aux paramètres.

Conclusion
J'espere avoir été suffisament simple dans mes explications.
Si j'arrive à trouver un peu de temps on en reviendra pour voir ensemble les champs d'application. On peut déja dire que cela amène une certaine flexivité dans la programmation puisqu'on a ce typage fort dans l'écriture des "delegate".
 

0 comments so far.

Something to say?