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


// Bitte beachten Sie auch den Fortsetzungsband zu diesem Buch, falls
// Ihnen das Programmieren Spaß gemacht hat und Sie sich fortgeschritteneren 
// Themen zuwenden wollen. Alle Informationen zum Fortsetzungsband finden
// Sie auf der Website: www.tiefer-einsteigen.de 

namespace Klassen
{
    class Program
    {
        static void Main(string[] args)
        {
            Person meier = new Person("Meier", 34);
            Console.WriteLine(meier.ToString());

            Lehrer müller = new Lehrer("Müller", 30, "Mathe");
            Console.WriteLine(müller.Name);
            Console.WriteLine(müller.Alter);
            Console.WriteLine(müller.Fach);

            Console.ReadKey();
        }
    }



    class Person
    {
        public const int alterUndefiniert = -1;

        private string name;
        private int alter;

        public Person(string name)
        {
            if (name == null)
                throw new System.ArgumentNullException();

            this.name = name;
            this.alter = alterUndefiniert;
        }

        public Person(string name, int alter)
        {
            this.name = name;
            this.alter = alter;
        }


        public bool Geburtstag()
        {
            if (this.alter != alterUndefiniert)
            {
                this.alter++;
                return true;
            }
            else
                return false;
        }

        // Eigenschaft Name, in der ausführlichen Schreibweise
        public string Name
        {
            get { return this.name; }
            set { this.name = value; }
        }

        // Eigenschaft Alter
        public int Alter
        {
            get { return this.alter; }
            set
            {
                if (this.alter == alterUndefiniert)
                    this.alter = value;
                else
                    throw (new System.InvalidOperationException("Das Alter ist bereits definiert."));
            }
        }


        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("base.ToString: ");
            sb.Append(base.ToString());
            sb.Append(System.Environment.NewLine);
            sb.Append("Die Person heisst: " + this.name + ". ");
            if (this.alter != alterUndefiniert)
            {
                sb.Append("Sie ist ");
                sb.Append(this.alter.ToString());
                sb.Append(" Jahre alt.");
                sb.Append(System.Environment.NewLine);
            }
            return sb.ToString();
        }
    }


    class Lehrer : Person
    {
        // Eigenschaft Fach als automatisch implementierte Eigenschaft
        public string Fach { get; set; }

        public Lehrer(string name, int alter, string fach)
            : base(name, alter)
        {
            this.Fach = fach;
        }

    }

}
