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

namespace heritage1
{
    enum RACE { INCONNU, GOLDEN, CAIRN, DANDIE, SHETLAND, DOBERMAN, LAB };

    public class Mammifere
    {
        // propriétés automatique
        public int Age { get; set; }
        // constructeurs 
        public Mammifere(int age)
        {
            Age = age;
        }
        //methodes
        public void Crier() { Console.WriteLine("Raaaa"); }
    }

    class Chien : Mammifere
    {  // propiété auto
        public RACE Race { get; set; }
        // ctor 1
        public Chien(int age, RACE race)
            : base(age)
        {
            Race = race;
        }
        // specialisation
        // new est optionnel => evite warning compilateur
        //new précise l'intention du concepteur de spécialisé la méthode
        public new void Crier()
        { Console.WriteLine("Ouarfff"); }
    };


    class convert
    {
        static void Main(string[] args)
        {
            
            
            // downcast avec as
            Mammifere unMammifere = new Mammifere(5);
            Chien autreChien = unMammifere as Chien;
            if (autreChien != null) 
                autreChien.Crier();
            else 
                Console.WriteLine("convertion dwoncast impossible");

            // upcast avec is
            Chien unChien =new Chien(5, RACE.GOLDEN);
            if (unChien is Mammifere)
                ((Mammifere)unChien).Crier();
            else
                Console.WriteLine("convertion upcast impossible");

            // UPCAST DIRECT
            Chien toutou = new Chien(5, RACE.GOLDEN);
            Mammifere mam=toutou;  //Upcast 
            mam.Crier(); // Raaaa .. le chien est vu comme un mammifere
            toutou.Crier(); //Ouarfff ... le chien est est vu comme un chien

            // DOWNCAST DIRECT
            Mammifere unMammifere2 = new Mammifere(5);
            // KO EXCEPTION Chien autreChien2 = (Chien)unMammifere2; // Downcast
            // KO EXCEPTION  autreChien2.Crier(); 

            Console.ReadKey();
        }
    }
}
