Ejemplo n.º 1
0
        private static void TestPolymorphism()
        {
            // Променлива от тип ICarnivore. Може да сочи към обект, който наследява интерфейс ICarnivore.
            // Чрез нея могат да бъдат достъпени методите описани в този интерфейс
            // както и методите описани в Object, защото всичко така или иначе наследява Object
            ICarnivore carnivore = CreateCarnivore();

            carnivore.EatMeat();
            carnivore.ToString();

            //Но чрез нея не могат да бъдат извикани методите на обект Fox, тък като тя (променливата) не е от тип Fox.
            //carnovore.StealTheCheese()


            //Променлива от тип AbstractAnimal. Може да сочи към обект, който наследява обект AbstractAnimal.
            //Чрез нея могат да бъдат достъпени методите описани в AbstractAnimal,
            //както и методите описани в Object, защото всичко така или иначе наследява Object
            //Но пак както преди не може да бъде използвана за извикване на методите на FOX
            AbstractAnimal anyAnimal = CreateAbstractAnimal();

            //Променлива от тип Object, може да сочи към всичко, защото всичко всъщност наследява Object, директно или не.
            //Но може да бъде използвана за извикване само на методи дефинирани в Object
            Object obj = CreateObject();

            obj.GetHashCode();

            // променлива от тип IHerbivore. Може да сочи към обект наследяващ IHerbivore - Elephant, Rabbit или Fox,
            // но не може да сме 100% сигурни към кое от тях без да сме проверили
            IHerbivore herbivore = CreateHerbivore();

            // може да проверим дали случайно не сочи към Rabbit
            if (herbivore is Rabbit)
            {
                // по случайност сочи към обект който всъщност е Rabbit
                Rabbit r;              // създаваме променлива от тип Заек - тя може да сочи само към обект от тип Заек.
                r = (Rabbit)herbivore; // тъй като вече сме проверили, че herbivore всъщност сочи към Заек е безопасно да кастнем към Заек.
                // тъй като r е от тип Заек може да извикваме методите на заек.
                r.DoZigZag();
            }
            else if (herbivore is Fox)
            {
                // съкратена версия на предното
                ((Fox)herbivore).StealTheCheese();
            }
            else if (herbivore is Elephant el)
            {
                // още по-съкратена версия на предното.
                el.DrinkFromTheNose();
            }

            // директното кастване е опасно: ((Fox)herbivore).StealTheCheese();
            // Използва се само ако преди това сме направили проверка дали наистина обекта е такъв, какъвто ние очакваме: if (herbivore is Fox)
            // В противен случай програмата ще гръмне ако не сме уцелили правилният тип

            //Втори вариант на кастване - ключова дума "as" :
            Fox fox = herbivore as Fox;

            if (fox == null)
            {
                // резултат 1: herbivore не е от тип лисица и няма как да бъде третиран като такава. Променливата Fox ще сочи към нищото.
                // При такъв вид кастване трябва винаги да се провери дали променливата не е null.
                Console.WriteLine("This herbivore is not a fox");
            }
            else
            {
                //резултат 2: успешно успяхме да кастнем към лисица, това означава, че обекта herbivore всъщност е лисица.
                // и сега чрез променливата fox може да викаме методи характерни само за лисица.
                fox.StealTheCheese();
            }


            //Всяка променлива от референтен тип А може:
            Fox        f        = new Fox();    //да сочи към обект от тип А
            IHerbivore herb     = new Rabbit(); //, обект, който наследява А
            Elephant   elephant = null;         //или към нищо (null)
        }
Ejemplo n.º 2
0
        static void Main(string[] args)
        {
            Console.WriteLine("Would you like to meet our animals in the zoo? Type yes or no");
            string answer = Console.ReadLine();

            if (answer == "yes")
            {
                Pig Luna = new Pig("Luna", 27, 160, "pink");
                Luna.Greeting();
                Luna.Eat();
                Luna.Looks();
                Luna.Product();

                Console.WriteLine("\n Would you like to meet the next animal in the zoo? Type yes or no");
                answer = Console.ReadLine();

                if (answer == "yes")
                {
                    Cow Ally = new Cow("Ally", 5, 300, "pink with black spots");
                    Ally.Greeting();
                    Ally.Eat();
                    Ally.Looks();
                    Ally.Product();

                    Console.WriteLine("\n Would you like to meet the next animal in the zoo? Type yes or no");
                    answer = Console.ReadLine();
                    if (answer == "yes")
                    {
                        Rabbit Ranciel = new Rabbit("Ranciel", 6, 45, "grey");
                        Ranciel.Greeting();
                        Ranciel.Eat();
                        Ranciel.Looks();
                        Ranciel.Product();
                        Console.WriteLine("\n Would you like to meet the next animal in the zoo? Type yes or no");
                        answer = Console.ReadLine();
                        if (answer == "yes")
                        {
                            Chicken Ellodie = new Chicken("Ellodie", 2, 10, "black");
                            Ellodie.Greeting();
                            Ellodie.Eat();
                            Ellodie.Looks();
                            Ellodie.Product();
                            Console.WriteLine("\n That is all the animals we have available today! Thank you for visiting our zoo!");
                            Environment.Exit(0);
                        }
                        else
                        {
                            Console.WriteLine("Thank you for visting");
                            Environment.Exit(0);
                        }
                    }
                    else
                    {
                        Console.WriteLine("Thank you for visting");
                        Environment.Exit(0);
                    }
                }
                else
                {
                    Console.WriteLine("Thank you for visting");
                    Environment.Exit(0);
                }
            }
            else
            {
                Console.WriteLine("Thank you for visting");
                Environment.Exit(0);
            }
        }