1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
public static void Main()
{
ExempleDynamic();
Console.Read();
}
public implicit interface IResponsable //ne peut hériter que d'une ou plusieurs interfaces implicites et doit contenir au moins un membre. Aucune classe ne peut explicitement implémenter une interface implicite.
{
string Nom { get; set; }
int Age { get; set; }
string Fonction { get; set; }
}
public class MembreDvp
{
public string Nom { get; set; }
public int Age { get; set; }
}
public class ResponsableDvp : MembreDvp
{
public string Nom { get; set; }
public int Age { get; set; }
public string Fonction { get; set; }
}
public static void ExempleDynamic()
{
ResponsableDvp membreResponsableDvp = new ResponsableDvp() { Nom = "Jérôme", Age = 24, Fonction = "Responsable .NET" }; //implémente implicitement IResponsable
Responsable membreResponsableDvp2 = new ResponsableDvp() { Nom = "Jérôme", Age = 22, Fonction = "Responsable C#" }; //n'implémente pas implicitement IResponsable mais l'implémentera à l'execution.
MembreDvp membreDvp = new MembreDvp() { Nom = "Benjamin", Age = 21 }; //n'implémente pas implicitement IResponsable
dynamic membreDvpDynamic = new MembreDvp() { Nom = "Laurent", Age = 25, Fonction = "Responsable PHP" }; //implémente implicitement IResponsable
var membreAutre = new { Sexe = 'M', Nom = "Louis", Age = 12, Fonction = "Responsable Java" }; // Objet anonyme - implémente implicitement IResponsable
AfficherMembre(membreResponsableDvp); //compile
AfficherMembre(membreResponsableDvp2); //ne compile pas
AfficherMembre(membreDvp); //ne compile pas
AfficherMembre(membreDvpDynamic);//compile
AfficherMembre(membreAutre);//compile
//tout compile
AfficherMembreDynamic(membreResponsableDvp); //s'exécutera correctement (early binding)
AfficherMembreDynamic(membreResponsableDvp2); //s'exécutera correctement (late binding)
AfficherMembreDynamic(membreDvp); //plantera
AfficherMembreDynamic(membreDvpDynamic);//s'exécutera correctement (early binding)
AfficherMembreDynamic(membreAutre);//s'exécutera correctement (early binding)
}
//accèpte tout types d'arguments et considère qu'ils sastisfont l'interface implicite donc propose l'intellisens.
//le compilateur essaie d'abord de résoudre le type à la compilation. Si l'argument passé en paramètre ne satisfait pas l'interface alors le binding est fait tardivement (comme n'importe quel objet dynamique).
public static void AfficherMembreDynamic(dynamic IResponsable membre)
{
Console.WriteLine("Le membre " + membre.Nom + " (" + membre.Fonction + ") est âgé de " + membre.Age + " ans");
}
//n'accèpte que les arguments qui sastisfont l'interface implicite.
public static void AfficherMembre(IResponsable membre)
{
Console.WriteLine("Le membre " + membre.Nom + " (" + membre.Fonction + ") est âgé de " + membre.Age + " ans");
} |