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=1Swap<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.
Görev
KolayHer 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 birDataStoragesınıfı oluştur. Depolama kapsayıcın şunları yapmalıdır:- Öğeleri tutmak için
Ttüründe özel bir diziye ve kaç öğenin depolandığını izleyen birCountö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
- Öğeleri tutmak için
Program.cs: Ana dosyanda genel sınıfının iki farklı türle çalıştığını göster. BirStorage<int>ve birStorage<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: HelloStorage<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)}
}
}
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
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci KayıtlarıKendi başına pratik yap: Online C# derleyicisi