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

namespace virtualexmple
{


 public class Mammifere
 {
//methodes
public virtual void Crier() { Console.WriteLine("Raaaa"); }
public virtual void Sous_Ordre_Especes() { Console.WriteLine("Mammifere"); }
public void NbreDePattes() { Console.WriteLine("Inconnu"); }
}
 

class Chien : Mammifere
 {  
    public override void Crier() { Console.WriteLine("Ouarfff"); }
    public void Sous_Ordre_Especes() { Console.WriteLine("Canidés"); }
    public void NbreDePattes() { Console.WriteLine("Chien: 4 pattes"); }
 };

class Chat : Mammifere
{
    public override void Crier() { Console.WriteLine("Miaouu"); }
    public override void Sous_Ordre_Especes() { Console.WriteLine("Félidés"); }
    public  void NbreDePattes() { Console.WriteLine("Chat: 4 pattes"); }
};



    class virtualExemple
    {
        static void Main(string[] args)
        {
            // Chien unChat = new Chat(); KO impossible
            Mammifere mam1 = new Chat(); // Upcast OK
            mam1.Crier();
            mam1.Sous_Ordre_Especes();
            mam1.NbreDePattes();

            mam1 = new Chien(); // mam1 pointe vers un chien maintenant Upcast OK
            mam1.Crier();
            mam1.Sous_Ordre_Especes();
            mam1.NbreDePattes();
            // On regroupe tout le monde sous le type de base
            List<Mammifere> maMenagerie=new  List<Mammifere>() ;
            // Je peuple la ménagerie
            maMenagerie.Add(new Chat());
            maMenagerie.Add(new Chien());
            maMenagerie.Add(new Mammifere());
            // Je fais crier tous le monde
            foreach (Mammifere mam in maMenagerie)
                mam.Crier();  

          
            Console.ReadKey();
        }
    }
}
