public void TestPolimorphismDynamic()
        {
            IDish tapa = new ConcreteDishTapa();

            tapa.Name  = "Croquetas";
            tapa.Price = 8;
            IDish dish = new ConcreteDishFull();

            dish.Name  = "Croquetas";
            dish.Price = 8;
            double normalDishPrice = dish.GetPrice();
            double normalTapaPrice = tapa.GetPrice();

            Assert.AreEqual(normalDishPrice, 8f);
            Assert.AreEqual(normalTapaPrice, 2f);
            //Call the same fucntion with same parameters
            //on diff derived classes with diff behaviour
            double moneyoffDishPrice = dish.GetPrice(1f);
            double moneyoffTapaPrice = tapa.GetPrice(1f);

            Assert.AreEqual(moneyoffDishPrice, 7f);
            Assert.AreEqual(moneyoffTapaPrice, 2f);
            //tapas should not apply moneyoff discounts
            Assert.AreEqual(moneyoffTapaPrice, normalTapaPrice);
        }
        public void TestInheritance()
        {
            /*** SINGLE INHERITANCE ***/
            //Tapa inherits attributes and methods from AbstractDish
            ConcreteDishTapa si_tapa = new ConcreteDishTapa();

            si_tapa.Name  = "Croquetas";
            si_tapa.Price = 8;
            //Tapa inherits methods from AbstractDish
            //percentage discount is implemented ONLY in Abstract dish
            //and getprice is overriden in derived classes
            Assert.AreEqual(si_tapa.GetPrice(50), 1f);
            //An object of the derived class can be casted to it base class
            Assert.IsTrue(si_tapa is AbstractDish);

            /*** HIERARCHICAL INHERITANCE ***/
            //Tapa, halfdish and dish inherits from AbstractDish
            ConcreteDishTapa hi_tapa     = new ConcreteDishTapa();
            ConcreteDishHalf hi_halfdish = new ConcreteDishHalf();
            ConcreteDishFull hi_dish     = new ConcreteDishFull();

            Assert.IsTrue(hi_tapa is AbstractDish);
            Assert.IsTrue(hi_halfdish is AbstractDish);
            Assert.IsTrue(hi_dish is AbstractDish);

            /*** MULTILEVEL INHERITANCE ***/
            //Tapa inherits from AbstractDish
            //which inherits from AbstractIdentity
            ConcreteDishTapa mi_tapa = new ConcreteDishTapa();

            mi_tapa.Id = 1;
            Assert.IsTrue(mi_tapa is AbstractDish);
            AbstractDish mi_dish = mi_tapa;

            Assert.IsTrue(mi_dish is AbstractedIdentity);
            Assert.IsTrue(mi_tapa is AbstractedIdentity);

            /*** MULTIPLE INHERITANCE ***/
            //AbstractDish inherits from AbstractIdentity and IDish
            ConcreteDishTapa mmi_tapa = new ConcreteDishTapa();

            Assert.IsTrue(mmi_tapa is IDish);
            Assert.IsTrue(mmi_tapa is AbstractedIdentity);
        }