Clear        


                
                    using _09_Inheritance.Demos.Elektronik;
using _09_Inheritance.Demos.Sekiller;

namespace _09_Inheritance
{
    internal class Program
    {
        // Inheritance (kalıtım veya miras), class (sınıf) hiyerarşi yapısında üstteki tek bir class üzerinden alttaki bir veya daha fazla class'a
        // field (alan), property (özellik) veya behavior'ların (davranış) aktarılmasını sağlayarak alttaki class'ların kendi field, property
        // veya behavior'ları üzerinden üstteki class yapısıyla birlikte genişletilmesini (extend) sağlar.
        // Dolayısıyla üstteki base (temel) veya parent class yapısı üzerinden aşağıdaki sub veya child class yapılarına
        // yeni alan, özellik veya davranışlar kazandırılmış olur.
        // Kalıtımda amaçlardan biri birden çok class'ta bulunacak ortak alan, özellik veya davranışları bir üst class'ta
        // oluşturarak aşağıdaki birden çok class'ta kod tekrarının önüne geçmektir.
        // C# programlama dilinde tüm class'ların en üstteki base veya parent class'ı Object class'ıdır, yani tüm nesneler default (varsayılan)
        // olarak object tipindeki nesneden türer.
        // Inheritance class'lar arasında is-a relationship kurar. Örneğin araba (sub class) bir araçtır (base class) veya
        // kare (sub class) bir şekildir (base class).



        static void Main(string[] args)
        {
            #region Futbol Takımları
            // FutbolTakimi tipindeki futbolTakimi1 referans değişkeni üzerinden FutbolTakimi tipinde obje initialize edilmesi (oluşturulması)
            FutbolTakimi futbolTakimi1 = new FutbolTakimi() 
            {
                Adi = "Fenerbahçe", // Takim base class'ından miras alınan özellik
                KurulusYili = 1907, // Takim base class'ından miras alınan özellik
                Sehir = "İstanbul", // Takim base class'ından miras alınan özellik

                TeknikDirektorAdi = "Jorge Jesus", // FutbolTakimi class'ı özelliği
                KaleciAdi = "Altay Bayındır", // FutbolTakimi class'ı özelliği
                DefansOyuncuAdlari = "Serdar Aziz, Gustavo Henrique, Attila Szalai, Ferdi Kadioglu", // FutbolTakimi class'ı özelliği
                OrtaSahaOyuncuAdlari = "Bright Osavi-Samuel, Miguel Crespo, Willian Arao", // FutbolTakimi class'ı özelliği
                ForvetOyuncuAdlari = "Diego Rossi, Joshua King, Michy Batshuayi", // FutbolTakimi class'ı özelliği
                OyunSistemi = "4-3-3" // FutbolTakimi class'ı özelliği
            };

            Console.WriteLine(futbolTakimi1.BilgiGetir()); // Takim base class'ından miras alınan davranış

            Console.WriteLine(futbolTakimi1.KadroGetir()); // FutbolTakimi class'ı davranışı

            Console.WriteLine("Oyun Sistemi: " + futbolTakimi1.OyunSistemi); // FutbolTakimi class'ı özelliği

            Console.WriteLine("Şehir: " + futbolTakimi1.Sehir); // Takim base class'ından miras alınan özellik

            // hem referans değişkeninin hem de oluşturulan objenin tipleri aynı olduğu için obje üzerinden tüm alan, özellik veya davranışlara ulaşılabilir
            
            Console.WriteLine();



            // Takim tipindeki takim2 referans değişkeni üzerinden FutbolTakimi tipinde obje initialize edilmesi (oluşturulması)
            Takim takim2 = new FutbolTakimi()
            {
                Adi = "Galatasaray", // Takim base class'ından miras alınan özellik
                KurulusYili = 1905, // Takim base class'ından miras alınan özellik
                Sehir = "İstanbul", // Takim base class'ından miras alınan özellik

                TeknikDirektorAdi = "Okan Buruk", // FutbolTakimi class'ı özelliği
                KaleciAdi = "Fernando Muslera", // FutbolTakimi class'ı özelliği
                DefansOyuncuAdlari = "Leo Dubois, Abdulkerim Bardakçı, Victor Nelsson, Sacha Boey", // FutbolTakimi class'ı özelliği
                OrtaSahaOyuncuAdlari = "Berkan Kutlu, Sergio Oliveira, Milot Rashica, Barış Alper Yılmaz", // FutbolTakimi class'ı özelliği
                ForvetOyuncuAdlari = "Muhammed Kerem Aktürkoğlu, Dries Mertens", // FutbolTakimi class'ı özelliği
                OyunSistemi = "4-4-2" // FutbolTakimi class'ı özelliği
            };

            Console.WriteLine(takim2.BilgiGetir()); // Takim base class'ından miras alınan davranış

            //Console.WriteLine(takim2.KadroGetir()); // takim2 referans değişkeni üzerinden KadroGetir methoduna ulaşılamaz

            // referans değişkeninin tipi Takim olduğundan takim2 referans değişkeni üzerinden sadece Takim içerisindeki alan, özellik veya davranışlara ulaşılabilir,
            // eğer FutbolTakimi içerisindeki alan, özellik veya davranışlara ulaşılmak isteniyorsa casting (birbirlerine uyumlu tip dönüşümü) yapılmalıdır.

            //FutbolTakimi futbolTakimi2 = (FutbolTakimi)takim2; // casting 1. yöntem
            FutbolTakimi futbolTakimi2 = takim2 as FutbolTakimi; // casting 2. yöntem

            Console.WriteLine(futbolTakimi2.KadroGetir()); // casting işleminden sonra futbolTakimi2 referans değişkeni üzerinden
                                                           // KadroGetir methoduna ulaşılabilir

            //Console.WriteLine("Oyun Sistemi: " + takim2.OyunSistemi); // takim2 referans değişkeni üzerinden OyunSistemi özelliğine ulaşılamaz
            Console.WriteLine("Oyun Sistemi: " + futbolTakimi2.OyunSistemi); // casting işleminden sonra futbolTakimi2 referans değişkeni üzerinden
                                                                             // OyunSistemi özelliğine ulaşılabilir

            Console.WriteLine("Şehir: " + futbolTakimi2.Sehir); // Takim base class'ından miras alınan özellik

            Console.WriteLine();
            #endregion



            #region Basketbol Takımları
            // BasketbolTakimi tipindeki basketbolTakimi3 referans değişkeni üzerinden BasketbolTakimi tipinde obje initialize edilmesi (oluşturulması)
            BasketbolTakimi basketbolTakimi3 = new BasketbolTakimi();

            basketbolTakimi3.Adi = "Beşiktaş"; // Takim base class'ından miras alınan özellik
            basketbolTakimi3.KurulusYili = 1903; // Takim base class'ından miras alınan özellik
            basketbolTakimi3.Sehir = "İstanbul"; // Takim base class'ından miras alınan özellik

            basketbolTakimi3.BasantrenorAdi = "Igor Milicic"; // BasketbolTakimi class'ı özelliği
            basketbolTakimi3.GeriSahaOyuncuAdlari = "Yağız Aksu, Allerik Freeman"; // BasketbolTakimi class'ı özelliği
            basketbolTakimi3.OnSahaOyuncuAdlari = "David McCormack, Okben Ulubay, Kerem Konan"; // BasketbolTakimi class'ı özelliği

            Console.WriteLine(basketbolTakimi3.BilgiGetir()); // Takim base class'ından miras alınan davranış

            Console.WriteLine($"Geri Saha: {basketbolTakimi3.GeriSahaOyuncuAdlari}"); // BasketbolTakimi class'ı özelliği
            Console.WriteLine($"Ön Saha: {basketbolTakimi3.OnSahaOyuncuAdlari}"); // BasketbolTakimi class'ı özelliği

            Console.WriteLine($"Başantrenör: {basketbolTakimi3.BasantrenorAdi}"); // BasketbolTakimi class'ı özelliği

            Console.WriteLine($"Şehir: {basketbolTakimi3.Sehir}"); // Takim base class'ından miras alınan özellik

            // hem referans değişkeninin hem de oluşturulan objenin tipleri aynı olduğu için obje üzerinden tüm alan, özellik veya davranışlara ulaşılabilir

            Console.WriteLine();



            // Takim tipindeki takim4 referans değişkeni üzerinden BasketbolTakimi tipinde obje initialize edilmesi (oluşturulması)
            Takim takim4 = new BasketbolTakimi();

            takim4.Adi = "Anadolu Efes"; // Takim base class'ı özelliği
            takim4.KurulusYili = 1976;  // Takim base class'ı özelliği
            takim4.Sehir = "İstanbul";  // Takim base class'ı özelliği

            Console.WriteLine(takim4.BilgiGetir() + "\nŞehir: " + takim4.Sehir); // Takim base class'ı davranışı ve özelliği

            Console.WriteLine();

            // referans değişkeninin tipi Takim olduğundan obje üzerinden sadece Takim class'ı içerisindeki alan, özellik veya davranışlara ulaşılabilir,
            // Takim takim4 = new Takim(); olarak obje initialization'ı da yapsak ki Takim concrete yani somut class olduğundan yapılabilir aynı sonucu alacaktık,
            // ancak bizim istediğimiz sonuç objeleri futbol veya basketbol takım objeleri olduğundan yukarıdaki kullanım pek uygun değildir
            #endregion



            #region Elektronik Demo
            ElektronikDemo.Calistir();
            #endregion



            #region Şekiller Demo
            SekillerDemo.Calistir();
            #endregion
        }
    }
}