6 Ağustos 2015

C# Virtual Metodlar

using System;

namespace VirtualFunctionMembers
{
    class Program
    {
        /*Virtual bir fonksiyon altclası tarafından değiştirilerek özelleştirilebilir.
         * Methodlar,özellikler, ve olaylar virtual şeklinde tanımlanabilir.
         */
        public class Urun
        {
            public string UrunAdi;
            public virtual  decimal ToplamTutar { get { return 0; } }
        }

        //virtual metoda uygulayacağımız değişiklik için altclass içerisinde override kullanırız.

        public class Gida : Urun
        {
            public DateTime SonKullanmaTarihi;

            public decimal Tutar { get; set; }

            public decimal VergiOrani { get; set; }

            public override decimal ToplamTutar
            {
                get
                {
                    return Tutar + (VergiOrani / 100) * Tutar;
                }
            }


        }
        public class Arac : Urun
        {
            public string Renk;

            public decimal Fiyat;
            public override decimal ToplamTutar
            {
                get
                {
                    return Fiyat;
                }
            }
        }

        public class Hava : Urun
        {
            public string Yer;
        }

        /*Varsayılan olarak Urun içerisinde Liability nin değeri 0 dır.
         * Gida yı kullanırken urunun bazı özelliklerini ondan miras aldık. Burada Vergi Oranı kullanılacak şekilde özelleştirebildik.
         * Otomobil için Fşyatını direk yansıtan bir method tanımladık.
         * Hava da ise varsayılan değer olan tutarı yani 0 lirayı atacaktır.
         */
        static void Main(string[] args)
        {
            Gida ekmek = new Gida { UrunAdi = "Ekmek",SonKullanmaTarihi=DateTime.Now,VergiOrani=8,Tutar=100};
            Urun a = ekmek;
            Console.WriteLine(ekmek.ToplamTutar);//108
            Console.WriteLine(a.ToplamTutar);//108
            //Burada gida için oluşturulan özel fonksiyonu kullanarak %8 vergi oranı olan bir fonksiyon oluşturduk.

            Console.WriteLine("//////////////////////////////////////////////");


            Arac oto = new Arac { UrunAdi = "Otomobil",Renk="Kırmızı",Fiyat=100 };
            Urun b = oto;
            Console.WriteLine(oto.ToplamTutar);//100
            Console.WriteLine(b.ToplamTutar);//100
            //Burada Aracın normal değerini yansıtan başka bir metod tanımladık


            Console.WriteLine("//////////////////////////////////////////////");


            Hava car = new Hava { UrunAdi = "Opel",Yer="İstanbul" };
            Urun c = car;
            Console.WriteLine(car.ToplamTutar);//0
            Console.WriteLine(c.ToplamTutar);//0
            //Burada Urunun varsayılan değerini alıyoruz. Yani otomatik olarak sıfır gelecektir.


            Console.ReadKey();


            /*Dikkat edersek yeni fonksiyon oluştururken override ettiğimiz ToplamTutar metodu
             * daha önceki virtual metodu değiştirerek oluşturduğumuz yeni classa özel bir metod haline getirdi.
             * */
          
        }
    }
}