internal abstract class Animal
    {
        public string name { get; set; }
        public Animal(string name) {
            this.name = name;
        }
        public abstract string MakeSound();
    }



    internal class Cat : Animal
    {
        public Cat(string name) : base(name) { }
        public override string MakeSound()
        {
            return $"The cat named {name} went Meow!";
        }
    }



    internal class Dog : Animal
    {
        public Dog(string name) : base(name) { }
        public override string MakeSound()
        {
            return $"The dog named {name} went Woof!";
        }
    }



        private void INHERITANCE_Click(object sender, EventArgs e)
        {
            List Animals = new List()
            {
                new Cat("Dave"),
                new Dog("Billy")
            };

            foreach (Animal animal in Animals) {
                Console.WriteLine(animal.MakeSound());
            }
        }



        private void POLY_Click(object sender, EventArgs e)
        {
            //poly

            Cat cat1 = new Cat("Dave");
            Dog dog1 = new Dog("Billy");

            cat1.name = "frank";

            List Animals = new List();

            Animals.Add(cat1);
            Animals.Add(dog1);

            foreach (Animal animal in Animals)
            {
                Console.WriteLine(animal.MakeSound());
            }
        }