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();
}
}
}