Menu
CoddyTech

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 metotlar 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.

Jenerik bir sınıf, genellikle T olarak adlandırılan ve açılı köşeli 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ğunda derleyici her T öğesini int ile değiştirir. Bu, derleme zamanında tür denetimi sağlar; bir int kutusunda yanlışlıkla bir dize saklayamazsın.

Genel yöntemler de benzer şekilde çalışır ve tek bir yöntemin farklı türlerde çalışmasına olanak tanır:

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

Derleyici türü bağımsız değişkenlerden çıkarır, bu nedenle 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 yazmayı sağlar.

challenge icon

Görev

Kolay

Her türden öğeyi tutabilen ve yönetebilen genel bir Storage<T> sistemi oluşturalım. Genel türlerin gücünü gösteren, yeniden kullanılabilir bir kapsayıcı sınıf oluşturacaksın: bir kez yaz, tamsayılarla, dizelerle veya başka herhangi bir türle kullan!

Kodunu iki dosyaya ayıracaksın:

  • Storage.cs: DataStorage ad alanında genel bir Storage<T> sınıfı oluştur. Depolama kapsayıcın şunları yapmalı:
    • Öğeleri tutmak için T türünde özel bir diziye ve kaç öğenin depolandığını takip eden bir Count özelliğine sahip olmalı
    • İç diziyi başlatmak için yapıcısında bir kapasite kabul etmeli
    • Yer varsa bir öğe ekleyen bir Add(T item) yöntemine sahip olmalı
    • Belirtilen dizindeki öğeyi döndüren bir Get(int index) yöntemine sahip olmalı
    • Depolanan tüm öğeleri ", " ile birleştirerek döndüren bir GetAll() yöntemine sahip olmalı
  • 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 sorunsuz ç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ı deposu ve kapasitesi 5 olan bir dize deposu oluştur. İki tamsayıyı tamsayı deposuna, iki dizeyi de dize deposuna 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ı bir kez yazdığını, ancak hem int hem de string ile mükemmel çalıştığını fark et: genel türlerin sihri budur! Derleyici tür güvenliğini sağlar; böylece yanlışlıkla tamsayı depona 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: Kapasitesi 5 olan bir Storage<int> oluştur
        
        // TODO: İki tam sayıyı tam sayı depolama alanına ekle
        
        // TODO: Kapasitesi 5 olan bir Storage<string> oluştur
        
        // TODO: İki dizgeyi dizge depolama alanına ekle
        
        // TODO: Çıktıyı istenen biçimde yazdır
        // Int storage: {GetAll()}
        // Tam sayı adedi: {Count}
        // İlk tam sayı: {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