26 Ağustos 2015

Generics 1 : Nedir?

using System;

namespace Generics
{
    class Program
    {
        /*
         * Generics
         C# bir farklı tipleri tekrar yazabilmek için iki ayrı mekanizmaya sahiptir. Bunlardan birisi inheritance diğeri generics.
         * Burada inheritance kullanırken onu taban olarak tanımlarız, oysa generics tanımlanırken vekil bir temadan faydalanırız.
         * Generic inheritance a göre daha yüksek tip güvenliğine sahiptir.
         *
         * Şimdi aşağıdaki generic tipini inceleyelim. Generic kullanırken <"Tip"> yazılır.
         * Aşağıdaki örnekte Stack<T> içerisine T="type" tipini tanımladık.
         * Burada T ye open type(açık tip) deriz. Açık tipler program çalışır haldeyken hata verir. Onları closed type(kapalı tip) formatına dönüştürmeliyiz.
         * Açık tip her formata dönüşebilir demektir. Fakat kapalı tipler standarttır.
         * Aşağıdaki örneği inceleyelim.
         */
        public class Stack<T>//Burada açık tip oluşturduk;
        {
            int position;
            T[] data = new T[100];
            public void Push(T obj) { data[position++] = obj; }
            public T Pop() { return data[--position]; }

            public Stack<T> Clone()
            {
                Stack<T> clone = new Stack<T>();//Bir classın içerisinde Stack<T> formatını kullanabiliriz. Çünkü burada program çalışır durumda değil.
                //Ve üretilirken klonlanan class kapalı tip olacaktır.
                return clone;
            }
        }





        static void Main(string[] args)
        {
            //Stack<T> stack2 = new Stack<T>();//Hata çünkü program çalışırken  açık tip olmamalıdır.


            Stack<int> stack = new Stack<int>();//Burada int string gibi formatlar kapalı tiptir ve program çalışırken bir bir hata vermez.
            /*Stack<int> stack = new Stack<int>(); yazınca aslında aşağıdaki gibi bir classtan eleman üretmiş oluyoruz.
           
            public class ###
            {
            int position;
            int[] data = new int[100];
            public void Push(int obj) { data[position++] = obj; }
            public int Pop() { return data[--position]; }
             }
            */


            stack.Push(5);
            stack.Push(10);
            int x = stack.Pop();
            int y = stack.Pop();

            Console.WriteLine(x);
            Console.WriteLine(y);

            Console.ReadKey();
        }
    }
}