using System;
using System.Collections.Generic;
using System.Linq;

namespace heritage1
{
    //Fonction Vole
    interface IVolant
    { void Vole();}

    interface IPatte
    {
        // définition d'une propriété en lecture
        int NbPatte { get; }
    }

    // classe de base
    public abstract class Mammifere
    {
        private string name;
        public string Nom
        {
            get { return name; }
            set { name = value; }
        }
        public abstract void Crier();
    }

    // Chien est un mammifère qui a aussi des pattes
    class Chien : Mammifere, IPatte
    {  // Implantation de NbPatte défini dans IPatte
        public int NbPatte
        {
            get { return (4); }
        }
        // implémente Crier de Mammifere
        public override void Crier() { Console.WriteLine("Ouarfff"); }
    }

    class Baleine : Mammifere
    {
        public override void Crier() { Console.WriteLine("Mouuuuu"); }
    }

    class ChauveSouris : Mammifere, IVolant, IPatte
    {   // Implémente  NbPatte défini dans IPatte
        public int NbPatte
        {
            get { return (2); }
        }
        // Implémente  Vole défini dans IVolant
        public void Vole() { Console.WriteLine("Flap flap"); }
        // surcharge polymorphe des classes de bases
        public override void Crier() { Console.WriteLine("Mriiiiii"); }

    }


    class Program
    {
        static void Main(string[] args)
        {
            // On regroupe tout le monde sous le type de base
            List<Mammifere> maMenagerie = new List<Mammifere>();
            // Je peuple la ménagerie
            maMenagerie.Add(new ChauveSouris());
            maMenagerie.Add(new Baleine());
            maMenagerie.Add(new ChauveSouris());
            maMenagerie.Add(new Chien());
            maMenagerie[3].Nom = "medor";

            //Allez tous le monde crie
            foreach (Mammifere mam in maMenagerie)
                mam.Crier();

            //Qui vole dans ma ménagerie????
            // Extraction des volants
            var listeVolant = maMenagerie.OfType<IVolant>();
            foreach (IVolant mamVolant in listeVolant)
            {
                mamVolant.Vole();
            }

            Console.ReadKey();
        }
    }
}
