Menu
Coddy logo textTech

Generics (Sınıflar ve Metotlar)

Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 42 / 70.

Jenerikler, tür güvenliğini korurken herhangi bir veri türüyle çalışan sınıflar ve yöntemler yazmanı sağlar. IntList, StringList ve DoubleList için ayrı sınıflar yazmak yerine, hepsini işleyen tek bir jenerik sınıf yazarsın.

Genel bir sınıf, genellikle T olarak adlandırılan ve açılı parantezler içine alınan bir tür parametresi kullanır:

public class Box<T>
{
    private T content;
    
    public void Store(T item) => content = item;
    public T Retrieve() => content;
}

// Farklı türlerle kullanım
Box<int> intBox = new Box<int>();
intBox.Store(42);

Box<string> stringBox = new Box<string>();
stringBox.Store("Hello");

Box<int> oluşturduğunuzda, derleyici her T'yi int ile değiştirir. Bu, derleme zamanı tür denetimi sağlar - bir int kutusunda yanlışlıkla bir dize saklayamazsınız.

Jenerik metotlar da benzer şekilde çalışarak tek bir metodun farklı türlerle çalışmasını sağlar:

public static void Swap<T>(ref T a, ref T b)
{
    T temp = a;
    a = b;
    b = temp;
}

int x = 1, y = 2;
Swap(ref x, ref y);  // x=2, y=1

Swap<int> ifadesini açıkça yazmanız gerekmez. Generics, List<T> ve Dictionary<TKey, TValue> gibi koleksiyonların temelini oluşturur ve yeniden kullanılabilir, tür güvenli kod yazılmasını sağlar.

challenge icon

Görev

Kolay

Her türden öğeyi tutup yönetebilen genel bir Storage<T> sistemi oluşturalım. Jeneriklerin gücünü gösteren yeniden kullanılabilir bir kapsayıcı sınıfı oluşturacaksın — bir kez yaz, tamsayılar, dizeler veya başka herhangi bir türle kullan!

Kodunu iki dosyaya ayıracaksın:

  • Storage.cs: Storage<T> ad alanında genel bir DataStorage sınıfı oluştur. Depolama kapsayıcın şunları yapmalıdır:
    • Öğeleri tutmak için T türünde özel bir diziye ve kaç öğenin depolandığını izleyen bir Count özelliğine sahip olmak
    • İç diziyi başlatmak için oluşturucusunda bir kapasite kabul etmek
    • Yer varsa bir öğe ekleyen bir Add(T item) yöntemine sahip olmak
    • Belirtilen dizindeki öğeyi döndüren bir Get(int index) yöntemine sahip olmak
    • Depolanan tüm öğeleri GetAll() ile birleştirerek döndüren bir ", " yöntemine sahip olmak
  • Program.cs: Ana dosyanda genel sınıfının iki farklı türle çalıştığını göster. Bir Storage<int> ve bir Storage<string> oluştur, her birine öğeler ekle ve aynı sınıfın her iki türle de sorunsuzca çalıştığını göster.

Dört girdi alacaksın:

  • Depolanacak ilk tamsayı
  • Depolanacak ikinci tamsayı
  • Depolanacak ilk dize
  • Depolanacak ikinci dize

Kapasitesi 5 olan bir tamsayı depolama alanı ve kapasitesi 5 olan bir dize depolama alanı oluştur. İki tamsayıyı tamsayı depolama alanına, iki dizeyi de dize depolama alanına ekle.

Çıktıyı şu biçimde yazdır:

Int storage: {GetAll()}
Int count: {Count}
First int: {Get(0)}
String storage: {GetAll()}
String count: {Count}
First string: {Get(0)}

Örneğin girdiler 42, 100, Hello ve World ise çıktı şöyle olmalıdır:

Int storage: 42, 100
Int count: 2
First int: 42
String storage: Hello, World
String count: 2
First string: Hello

Storage<T> sınıfını yalnızca bir kez yazdığını, ancak hem int hem de string ile mükemmel şekilde çalıştığını fark et — jeneriklerin sihri budur! Derleyici tür güvenliğini sağlar; böylece yanlışlıkla tamsayı depolama alanına bir dize ekleyemezsin.

Kendin dene

using System;
using DataStorage;

class Program
{
    public static void Main(string[] args)
    {
        // Girdileri oku
        int num1 = Convert.ToInt32(Console.ReadLine());
        int num2 = Convert.ToInt32(Console.ReadLine());
        string str1 = Console.ReadLine();
        string str2 = Console.ReadLine();

        // TODO: 5 kapasiteli bir Storage<int> oluştur
        
        // TODO: İki tam sayıyı integer deposuna ekle
        
        // TODO: 5 kapasiteli bir Storage<string> oluştur
        
        // TODO: İki dizeyi string deposuna ekle
        
        // TODO: Çıktıyı istenen formatta yazdır
        // Int storage: {GetAll()}
        // Int count: {Count}
        // First int: {Get(0)}
        // String storage: {GetAll()}
        // String count: {Count}
        // First string: {Get(0)}
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C# derleyicisi