// Animal.cs
// Versión 1.0
// Fecha 6-Enero-2003
// Autor Juan Manuel Cueva Lovelle
// Ejemplo de herencia

using System;

namespace Mascotas
{
    /// <summary>
    /// La clase animal es la base de una jerarquía de clases
    /// </summary>
    class Animal
    {
        protected string nombre="Sin nombre";
        /// <summary>
        /// Propiedad Nombre
        /// </summary>
        public string Nombre
        {
            set {nombre=value;}
            get {return nombre;}
        }
        protected int codigo;
        protected static int contador=0;

        // Propiedad Edad
        protected int edad;

        public int Edad
        {
            set
            {
                if (value>=0)
                    edad=value;
                else
                    Console.WriteLine("Edad no válida");
            }
            get{return edad;}
        }
        //Sobrecarga de constructores
        public Animal()
        {
            codigo=contador++;
            Console.WriteLine("Se construyo el animal "+nombre);
        }

        public Animal(string nombre)
        {
            this.nombre=nombre;
            codigo=contador++;
            Console.WriteLine("Se construyo el animal "+nombre);
        }

        public virtual void Hablar()
        {
            Console.WriteLine("El animal "+nombre+" dice um, um ...");
        }
        //Método estático
        public static int VerContador()
        {
            return contador;
        }

        public override string ToString()
        {
            return ("Animal:"+nombre+" Código:"+codigo+" Edad:"+edad);
        }
    }
    class Mamifero:Animal
    {
        public Mamifero ()
        {
            // Llamada implícita al constructor de la clase padre
            Console.WriteLine("Se construyo el mamifero "+nombre);
        }
        public Mamifero (string nombre):base(nombre)
        {
            // Llamada implícita al constructor de la clase padre
            Console.WriteLine("Se construyo el mamifero "+nombre);
        }
        public override void Hablar()
        {
            base.Hablar();
            Console.WriteLine("El mamifero dice "+nombre+" dice uf,uf,...");
        }
    }
    class Perro:Mamifero
    {
        public Perro ()
        {
            // Llamada implícita al constructor de la clase padre
            Console.WriteLine("Se construyo el perro "+nombre);
        }
        public Perro (string nombre):base(nombre)
        {
            // Llamada implícita al constructor de la clase padre
            Console.WriteLine("Se construyo el perro "+nombre);
        }
        public override void Hablar()
        {
            base.Hablar();
            Console.WriteLine("El perro dice "+nombre+" dice guau");
        }
        /// <summary>
        /// Prueba unitaria del módulo Mascotas
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //Pruebas de la clase Animal
            Animal prehistorico = new Animal();
            Animal casero = new Animal("Elmo");

            prehistorico.Edad=5000;
            casero.Edad=1;
            casero.Hablar();

            string unNombre;
            Console.Write("Dame un nombre para un animal prehistórico: ");
            unNombre=Console.ReadLine();
            prehistorico.Nombre=unNombre;

            Console.WriteLine("Dime lo que sabes de ... "+prehistorico);
            Console.WriteLine("Dime lo que sabes de ... "+casero);


            // Pruebas de la clase Mamifero
            Mamifero delfin = new Mamifero();
            delfin.Nombre="delfín";
            Console.WriteLine("Dime lo que sabes de ... "+delfin);

            Mamifero ballena = new Mamifero ("baba");
            ballena.Hablar();

            Console.WriteLine("Dime lo que sabes de ... "+ballena);

            // Pruebas de la clase Perro
            Perro pio = new Perro();
            pio.Edad=2;
            pio.Nombre="pio";
            pio.Hablar();
            Console.WriteLine("Dime lo que sabes de ... "+pio);

            Perro pancho = new Perro ("pancho");
            pancho.Hablar();
            Console.WriteLine("Dime lo que sabes de ... "+pancho);

            //Ejemplo de llamada a método estático
            Console.WriteLine("Los animales creados son "+Animal.VerContador());

            //Espera una tecla para finalizar
            Console.ReadLine();

        }
    }
}