// ======================================================================== // // Copyright (C) 2016-2017 MARC CHEVALDONNE // marc.chevaldonne.free.fr // // Module : Program.cs // Author : Marc Chevaldonné // Creation date : 2016-09-26 // // ======================================================================== using static System.Console; namespace ex_018_001_polymorphisme { //classe mère class MediaObjet { public string Titre { get { return mTitre; } } protected string mTitre = "unknown"; protected int mAnnéeCréation; public MediaObjet(string titre, int année) { mTitre = titre; mAnnéeCréation = année; } //notez que Affiche est maintenant virtuelle public virtual void Affiche() { WriteLine($"Ce média s'intitule {mTitre} et a été créé en {mAnnéeCréation}"); } } //une classe fille class Disque : MediaObjet { private string mArtiste = "unknown"; public Disque(string titre, int année, string artiste) : base(titre, année) { mArtiste = artiste; } //on précise qu'il s'agit bien de la méthode virtuelle de la classe mère avec le mot clé override public override void Affiche() { WriteLine($"Le disque {mTitre} a été enregistré par {mArtiste} en {mAnnéeCréation}"); //on peut aussi continuer à appeler la méthode Affiche de la classe mère à l'aide de base en décommentant la ligne suivante : //base.Affiche(); } } //une autre classe fille class Livre : MediaObjet { private string mAuteur; public Livre(string titre, int année, string auteur) : base(titre, année) { mAuteur = auteur; } //on précise qu'il s'agit bien de la méthode virtuelle de la classe mère avec le mot clé override public override void Affiche() { WriteLine($"Le livre {mTitre} a été écrit par {mAuteur} en {mAnnéeCréation}"); } } class Program { static void Main(string[] args) { OutputEncoding = System.Text.Encoding.UTF8; //ici pas de pb : //l est de type Livre (construit avec Livre) et appelle Affiche de Livre Livre l = new Livre("Attenti al Gorilla", 1995, "Sandrone Dazieri"); l.Affiche(); //d est de type Disque (construit avec Disque) et appelle Affiche de Disque Disque d = new Disque("Underground", 2007, "Chris Potter"); d.Affiche(); //mo est de type MediaObjet (construit avec MediaObjet) et appelle Affiche de MediaObjet MediaObjet mo = new MediaObjet("La Grande Vadrouille", 1966); mo.Affiche(); //modifions un peu à présent : //mo1 est de type MediaObjet et construit avec le constructeur de MediaObjet, il appelle Affiche de MediaObjet MediaObjet mo1 = new MediaObjet("La Grande Vadrouille", 1966); mo1.Affiche(); //mo2 est de type MediaObjet mais construit avec le constructeur de Livre, il appelle Affiche de Livre MediaObjet mo2 = new Livre("Attenti al Gorilla", 1995, "Sandrone Dazieri"); mo2.Affiche(); //mo2 est de type MediaObjet mais construit avec le constructeur de Disque, il appelle Affiche de Disque MediaObjet mo3 = new Disque("Underground", 2007, "Chris Potter"); mo3.Affiche(); //avec les méthodes virtuelles, lors de l'exécution, le véritable type est testé. //on peut toutefois continuer à appeler la méthode (dite maintenant cachée) de la classe mère 0 l'aide de base //cf. commentaire dans la classe Disque //on peut aussi utiliser le mot clé "is" pour tester le type d'un objet if (mo1 is Livre) { WriteLine($"{mo1.Titre} est un livre"); } else { WriteLine($"{mo1.Titre} n'est pas un livre"); } if (mo2 is Livre) { WriteLine($"{mo2.Titre} est un livre"); } else { WriteLine($"{mo2.Titre} n'est pas un livre"); } if (mo3 is Livre) { WriteLine($"{mo3.Titre} est un livre"); } else { WriteLine($"{mo3.Titre} n'est pas un livre"); } //ou encore le mot clé as Livre l2 = mo2 as Livre; if (l2 != null) l2.Affiche(); else WriteLine($"{mo2.Titre} n'est pas un livre"); Livre l3 = mo3 as Livre; if (l3 != null) l3.Affiche(); else WriteLine($"{mo3.Titre} n'est pas un livre"); } } }