Clear        


                
                    namespace _16_AccessibilityModifiers
{
    // Accessibility Modifiers (Visibility Modifiers) erişim belirleyicileridir.

    // Class'lardaki field (alan), property (özellik) ve behavior'ların (davranış, method) ilk olarak class içerisinde,
    // daha sonra inheritance (kalıtım) üzerinden class'tan miras alan sub class'lar içerisinde ve
    // son olarak da class'lardan oluşturulan obje referans değişkenleri üzerinden erişimlerinin yönetilmesini sağlar.

    // Dar erişimden geniş erişime doğru private, protected, internal ve public başlıca erişim belirleyicileridir.

    // 1) private, protected, internal veya public erişim belirleyicilerine sahip alan, özellik veya methodlara
    // kullanıldıkları sınıf içerisindeki method veya constructor'lar içerisinde erişilebilir.

    // 2) protected, internal ve public erişim belirleyicilerine sahip alan, özellik veya methodlara
    // miras aldıkları sınıf (sub class) içerisindeki method veya constructor'lar içerisinde erişilebilir.

    // 3) internal ve public erişim belirleyicilerine sahip alan, özellik veya methodlara
    // oluşturuldukları obje referans değişkeni üzerinden erişilebilir.

    // 4) internal sınıf içerisinde, kalıtımda ve obje referans değişkeni üzerinden public ile aynı erişim kullanımına sahiptir.
    // genelde alan, özellik veya methodlarda internal kullanılmaz.
    // Tek farkı internal tanımlanan sınıflara sadece aynı proje (assembly: proje kodlarının makine diline derlenmiş hali)
    // içerisinde erişilebilirken, public tanımlanan sınıflara başka projeler (farklı assembly'ler) üzerinden de .dll veya .exe
    // referansları projeye eklendikten sonra erişilebilir.



    public class Base // sınıflar genelde public veya internal tanımlanır,
                      // sınıflarda eğer erişim belirleyici yazılmazsa varsayılan (default) internal'dır,
                      // genelde tüm sınıflar için aynı erişim belirleyicisi kullanılır,
                      // bu sınıfın method ve constructor'larında sınıfın altında tanımlanan
                      // tüm alan, özellik ve methodlara erişilebilir
    {
        #region Private Class İçi Kullanımı
        private bool _private1; // private erişim belirleyicisine sahip alanların genelde başında _ kullanılır,
                                // değer ataması yapılmadığı için varsayılan değeri false'dur

        byte _private2 = 2; // private byte _private2 = 2; ile aynı,
                            // alanlarda eğer erişim belirleyici yazılmazsa varsayılan private'dır,
                            // eğer istenirse alanlara ilk değer ataması yapılabilir

        private short Private3 { get; set; } = 3; // özellikler genelde private tanımlanmaz,
                                                  // eğer istenirse özelliklere ilk değer ataması yapılabilir

        private void SetBasePrivate()
        {
            bool local1 = true; // içerisinde kullanıldığı methodun local değişkeni,
                                // bu değişkene bu sınıfın başka methodları üzerinden erişilemez

            _private1 = local1;
            _private2 = 22;
            Private3 = 33;
        }

        void DisplayBasePrivate1() // private void DisplayBasePrivate1() ile aynı,
                                   // methodlarda eğer erişim belirleyici yazılmazsa varsayılan private'dır
        {
            // local1 değişkeni SetBasePrivate methodu sınırı (scope) içerisinde tanımlandığından bu method içerisinden erişilemez
            /*
            Console.WriteLine("local1:" + local1); 
            */

            Console.WriteLine("_private1: " + _private1);
            Console.WriteLine("_private2: " + _private2);
            Console.WriteLine("Private3: " + Private3);
        }

        private void DisplayBasePrivate2() 
        {
            DisplayBasePrivate1();
        }
        #endregion



        #region Protected Class İçi Kullanımı
        protected int protected1; // değer ataması yapılmadığı için varsayılan değeri 0'dır

        protected long Protected2 { get; set; } // değer ataması yapılmadığı için varsayılan değeri 0'dır

        protected void SetBaseProtected()
        {
            _private1 = false;
            _private2 = 222;
            Private3 = 333;

            protected1 = 1;
            Protected2 = 2;
        }

        protected void DisplayBaseProtected1()
        {
            DisplayBasePrivate2();

            Console.WriteLine("protected1: " + protected1);
            Console.WriteLine("Protected2: " + Protected2);
        }

        protected void DisplayBaseProtected2()
        {
            DisplayBaseProtected1();
        }
        #endregion



        #region Public Class İçi Kullanımı
        public double public1; // alanlar genelde public tanımlanmaz,
                               // değer ataması yapılmadığı için varsayılan değeri 0'dır

        public string Public2 { get; set; } // değer ataması yapılmadığı için varsayılan değeri null'dır

        public void SetBasePublic()
        {
            _private1 = true;
            _private2 = 22;
            Private3 = 33;

            protected1 = 11;
            Protected2 = 22;

            public1 = 1;
            Public2 = "2";
        }

        public void DisplayBasePublic()
        {
            DisplayBaseProtected2();

            Console.WriteLine("public1: " + public1);
            Console.WriteLine("Public2: " + Public2);
        }
        #endregion
    }



    class Sub : Base // internal class Sub : Base ile aynı 
    {
        #region Private Kalıtım Üzerinden Kullanımı (Kullanılamaz)
        private void DisplaySubPrivate()
        {
            // private tanımlanan alan, özellik veya methodlara miras alan sınıfın method ve constructor'ları içerisinde erişilemez
            /*
            local1 = false; // local1 değişkeni SetBasePrivate methodu sınırı (scope) içerisinde tanımlandığından
                            // bu method içerisinden erişilemez
            _private1 = true;
            _private2 = 9;
            Private3 = 8;
            DisplayBasePrivate2();
            */
        }
        #endregion



        #region Protected Kalıtım Üzerinden Kullanımı
        protected void DisplaySubProtected()
        {
            // private tanımlanan alan, özellik veya methodlara miras alan sınıfın method ve constructor'ları içerisinde erişilemez
            /*
            _private1 = false;
            _private2 = 99;
            Private3 = 88;
            DisplayBasePrivate2();
            */

            // protected tanımlanan alan, özellik veya methodlara miras alan sınıfın method ve constructor'ları içerisinde erişilebilir
            protected1 = 9;
            Protected2 = 8;
            DisplayBaseProtected2();
        }
        #endregion



        #region Public Kalıtım Üzerinden Kullanımı
        public void DisplaySubPublic()
        {
            // private tanımlanan alan, özellik veya methodlara miras alan sınıfın method ve constructor'ları içerisinde erişilemez
            /*
            _private1 = true;
            _private2 = 9;
            Private3 = 8;
            DisplayBasePrivate2();  
            */

            // protected tanımlanan alan, özellik veya methodlara miras alan sınıfın method ve constructor'ları içerisinde erişilebilir
            protected1 = 99;
            Protected2 = 88;
            DisplayBaseProtected2();

            // public tanımlanan alan, özellik veya methodlara miras alan sınıfın method ve constructor'ları içerisinde erişilebilir
            public1 = 9;
            Public2 = "8";
            DisplayBasePublic();
        }
        #endregion
    }



    internal class Program
    {
        static void Main(string[] args)
        {
            Base parent = new Base(); // Base tip objesi initialization
            Sub child = new Sub(); // Sub tip objesi initialization



            #region Private Obje Üzerinden Kullanımı (Kullanılamaz)
            // private tanımlanan alan, özellik veya methodlara ne base ne de sub objeler üzerinden erişilemez 
            /*
            parent._private1 = false;
            parent._private2 = 4;
            parent.Private3 = 5;
            parent.DisplayBasePrivate2();
            */
            #endregion



            #region Protected Obje Üzerinden Kullanımı (Kullanılamaz)
            // protected tanımlanan alan, özellik veya methodlara ne base ne de sub objeler üzerinden erişilemez 
            /*
            parent.protected1 = true;
            parent.Protected2 = 44;
            parent.DisplayBaseProtected2();
            */
            #endregion



            #region Public Obje Üzerinden Kullanımı
            // public tanımlanan alan, özellik veya methodlara hem base hem de sub objeler üzerinden erişilebilir
            parent.public1 = 6;
            parent.Public2 = "7";
            parent.DisplayBasePublic();

            child.public1 = 66;
            child.Public2 = "77";
            child.DisplayBasePublic();
            child.DisplaySubPublic();
            #endregion
        }
    }
}