26 Ağustos 2015

Nested (İç içe) Tipler

using System;

namespace NestedTypes
{
    class Program
    {
        /*
         Nested Types(İç içe tipler)
         * Nested tipler  bir başka tip içerisinde tanımlanmış tiplere denir.
         * Örneğin
         */
        public class TopLevel
        {
            public class Nested { }//Nested Class
            public enum Color { Red, Blue, Tan }//Nested Enum
        }
        /*Nested Tipler aşağıdaki özelliklere sahiptir.
         * Nested tip onu kapsayan tipin tüm private özelliklerine ve onun kapsayan tipin erişebildiği herşeye erişebilir.
         * Bütün erişim tanımlayıcıları (access modifiers) tanımlanabilir.
         * Nested type in varsayılan erişim yapılandırıcısı privatedir.
         * Tüm tipler (class,struct,interface,delegate,enum) bir class ya da struct ın içine tanımlanabilir.       
         */

        /////////////////////////////////////////////////////////////////////////////////////////////
        //Private Eleman Örneği
        public class TopLevel1
        {
            static int x;
            class Nested
            {
                static void Foo() { Console.WriteLine(TopLevel1.x); }//Kapsayan dilin her elemanına erişebilir.
            }
        }
        /////////////////////////////////////////////////////////////////////////////////////////
        //Protected Örneği

        public class TopLevel2
        {
            protected class Nested { }
        }
        public class SubTopLevel2:TopLevel2
        {
            static void Foo() { new TopLevel2.Nested() }
        }

        ///////////////////////////////////////////////////////////////////////////////////////////////////
        //Dışarıdan bir nested type i referans almak.
        public class TopLevel3
        {
            public class Nested { }
        }
        class Test
        {
            TopLevel3.Nested n;
        }




        static void Main(string[] args)
        { //Nested Tiple Dışarıdan Erişebilmek için Statiklerde olduğu gibi adını yazmalıyız.Örneğin.
            TopLevel.Color color = TopLevel.Color.Blue;
        }
    }
}