using System;
using System.Collections.Generic;

namespace limiteHeritage
{

    public abstract class Mammifere
    {
        //methodes
        public abstract void Crier();
        public abstract void Sous_Ordre_Especes();
        public abstract void NbreDePattes();
    }

    internal class Chien : Mammifere
    {
        public override void Crier()
        {
            Console.WriteLine("Ouarfff");
        }

        public override void Sous_Ordre_Especes()
        {
            Console.WriteLine("Canidés");
        }

        public override void NbreDePattes()
        {
            Console.WriteLine("Chien: 4 pattes");
        }
    }

    internal class Baleine : Mammifere
    {
        public override void NbreDePattes()
        {
            throw new NotImplementedException();
        }

        public override void Crier()
        {
            Console.WriteLine("Mouuuuu");
        }

        public override void Sous_Ordre_Especes()
        {
            Console.WriteLine("Cétacés");
        }
    }

    internal class ChauveSouris : Mammifere
    {
        public override void NbreDePattes()
        {
            Console.WriteLine("2 papattes");
        }

        public override void Crier()
        {
            Console.WriteLine("Mriiiiii");
        }

        public override void Sous_Ordre_Especes()
        {
            Console.WriteLine("chiroptères");
        }

        public void Vole()
        {
            Console.WriteLine("Flap flap");
        }
    }

    internal class Program
    {

        private static void Main()
        {
            ChauveSouris uneChauveSouris = new ChauveSouris();
            uneChauveSouris.Vole(); //OK car uneChauveSouris du type uneChauveSouris
            // 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[0].Vole();  KO maMenagerie[0] fait référence à un mammifere
            // Vole() n'est pas dans la classe de base!
            maMenagerie.Add(new Baleine());
            // maMenagerie[1].NbreDePattes(); KO la baleine n'a pas de pattes
            //Qui vole et qui a des pattes dans ma ménagerie????
            foreach (Mammifere mam in maMenagerie)
            {
                // mam.Volant();  KO: volant n'est pas dans la classe de base!  
                mam.NbreDePattes(); //  KO: arrivé à la baleine BOOM
            }
            Console.ReadKey();
        }
    }
}

