C# Generic Sınıf ve Metot Kullanımı

Örneğin bir generic tipi(type) T parametresini kullanma yoluyla, belirli bir tipe bağlı olmayan, bir tek sınıf yazabilirsin. Kod tekrarını önler.

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MyList<int> ml = new MyList<int>();
            ml.Add(1);
            ml.Add(2);

            MyList<string> ml1 = new MyList<string>();
            ml1.Add("test 1");
            ml1.Add("test 2");

            Person p1 = new Person();
            p1.name = "Cihan";
            p1.surName = "AŞAN";
            p1.age = 32;
            MyList<Person> ml2 = new MyList<Person>();
            ml2.Add(p1);

            Console.ReadKey();
        }

    }
    public class MyList<T>
    {
        public void Add(T param) { }
    }
    public class Person
    {
        public string name { get; set; }
        public string surName { get; set; }
        public int age { get; set; }
    }
}

MyList generic sınıfı T parametresini kullanarak veri türü farketmeksizin(int, string, Person) işlem yapabilmektedir.

System.Collections.Generics kütüphanesini de kullanabilirsiniz. Örneğin List, Dictionary, Queue (First In First Out), Stack (Last In First Out), SortedList (Key değerine göre sıralama) gibi.

using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> list1 = new List<string>();
            list1.Add("Araba");
            list1.Add("Otobüs");
            list1.Add("Vapur");

            foreach(var item in list1)
            {
                Console.WriteLine(item);
            }

            List<int> list2 = new List<int>();
            list2.Add(1);
            list2.Add(2);
            list2.Add(3);

            foreach (var item in list2)
            {
                Console.Write(" " + item);
            }

            Console.ReadKey();
        }

    }
}

Çıktı :

generic kullanimi c#
generic kullanimi c#

List generic sınıfı string ve int veri türleri parametre olarak girilir.

Generic sınıflar veya metotlarda kısıtlamalar; Aşağıdaki örnekte tek bir kısıtlama tanımlanmıştır. where T : Arac sayesinde if(arac.agirlik > 750) koşulundaki base class olan Arac sınıfının agirlik özelliği kullanılmıştır.

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            Araba araba = new Araba();
            araba.agirlik = 1000;
            araba.renk = "Kırmızı";
            araba.marka = "Mercedes";

            AracIslemleri<Araba> islem = new AracIslemleri<Araba>();
            islem.Ekle(araba);

            Console.ReadKey();
        }

    }
    public class AracIslemleri<T> where T : Arac
    {
        public void Ekle(T arac) {
            if(arac.agirlik > 750)
            {
                //Ekle
            }
        }
    }
    public class Arac
    {
        public int agirlik { get; set; }
        public string renk { get; set; }
        public string marka { get; set; }
    }
    public class Araba : Arac
    {

    }
    public class Ucak : Arac
    {

    }
    public class Gemi : Arac
    {

    }
}

Bazı kısıtlamalar (constraint);

where T : Arac, new()
IComparable
where T : Arac

IComparable örneği;

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            Araba a1 = new Araba();
            a1.agirlik = 1000;
            a1.renk = "Kırmızı";
            a1.marka = "Mercedes";

            Araba a2 = new Araba();
            a2.agirlik = 1100;
            a2.renk = "Beyaz";
            a2.marka = "BMW";

            AracIslemleri<Araba> arac = new AracIslemleri<Araba>();
            arac.Compare(a1,a2);

            Console.ReadKey();
        }

    }
    public class AracIslemleri<T> where T : Arac
    {
        public void Compare(T arac1, T arac2)
        {
            Console.WriteLine(arac1.CompareTo(arac2));
        }
    }
    public class Arac : IComparable
    {
        public int agirlik { get; set; }
        public string renk { get; set; }
        public string marka { get; set; }
        public int CompareTo(object obj)
        {
            Arac arac = (Arac)obj;
            if (this.agirlik == arac.agirlik)
                return 0;
            else if (this.agirlik > arac.agirlik)
                return -1;
            else
                return 1;
        }
    }
    public class Araba : Arac
    {

    }
    public class Ucak : Arac
    {

    }
    public class Gemi : Arac
    {

    }
}

Çıktı : 1

Örneğin public class AracIslemleri where T : Arac, new() ifadesini kullanırsanız, Araba, Gemi ve Ucak sınıflarında constructor metodunda parametre new() metodundan dolayı kullanamazsınız.

    public class Araba : Arac
    {
        public Araba()
        { }
    }

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir