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

namespace heritage1
{

    enum RaceChien { INCONNU, GOLDEN, CAIRN, DANDIE, SHETLAND, DOBERMAN, LAB };

    public class Mammifere
    {
        protected int poids;
        private int age;
        // propriété
        public int Poids {
            get
            {
                return poids;
            }
            set
            {
                poids = value;
            }
        }

        // constructeur de la classe de base
        public Mammifere(int age, int poids)
        {
            // Cette affichage est à but pédagogique uniquement
            // Objectif: voir la séquence d'appel des ctor
            Console.WriteLine("Ctor Mammifere");
            this.age = age; // accès direct au champs (le concepteur n'a pas voulu de modification après crétaion de l'objet)
            Poids = poids;// accès via propriété
        }
        public void Crier() { Console.WriteLine("Raaaa"); }
        public void Dormir() { Console.WriteLine("Zzzzz"); }
        public override string ToString()
        {   // un mammifere est capable d'afficher son age son poids
            return ("age " + age + ", poids " + Poids);
        }
    }

    // un chien EST un mammifere
    class Chien : Mammifere
    {
        
        public RaceChien Race { get; set; }
        public string Nom { get; set; }
        // ctor1
        public Chien(int age, int poids)
            : base(age, poids)
        {   // Cette affichage est à but pédagogique uniquement
            // Objectif: voir la séquence d'appel des ctor
            Console.WriteLine("Ctor Chien age,poids");
            Race = RaceChien.INCONNU;
        }
        // ctor2
        public Chien(RaceChien race, int age, int poids)
            : base(age, poids)
        {
            Console.WriteLine("Ctor Chien race,age,poids");
            Race = race;
        }

        // ctor3
        public Chien(RaceChien race,String nom, int age, int poids)
            : this(race,age, poids)
        {
            Console.WriteLine("Ctor Chien race,nom,age,poids");
            Nom = nom;
        }
        public override string ToString()
        {
            // base.ToString() appelle le ToString de la classe de base (Mammifere donc)
            // et je complete avec les infos spécifiques du Chien
            string retourToStringdeLaClasseMammifere = base.ToString();
            return ("Chien " + retourToStringdeLaClasseMammifere + " ,Race " + Race);
        }

        public void changeAttributsPoidsEtAge(int ageChien, int poidsChien)
        {
            poids = poidsChien; // autorisé car protected  mais déconseillé : on préfère Poids=poidsChien;
            // KO age = ageChien;   car Age est private 
        }
    };


    class Program
    {
        static void Main(string[] args)
        {
            Mammifere unMamifere = new Mammifere(10, 5);
            unMamifere.Crier();
            Console.WriteLine(unMamifere);
            Chien unChien = new Chien(RaceChien.GOLDEN, 5, 10);
            Console.WriteLine(unChien);
            unChien.Dormir();
            unChien.Crier();
            Chien autreChien = new Chien(2, 1);
            autreChien.changeAttributsPoidsEtAge(4, 5); // probleme car l'age de Mammifere est private et  pas  de setter pour l'age
            Console.WriteLine(autreChien);
            Chien encoreUnChien = new Chien(RaceChien.GOLDEN, "Medor",5, 10);
            Console.WriteLine(encoreUnChien);
            Console.ReadKey();
        }
    }
}
