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=1Derleyici 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.
Görev
KolayHer 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:DataStoragead alanında genel birStorage<T>sınıfı oluştur. Depolama kapsayıcın şunları yapmalı:- Öğeleri tutmak için
Ttüründe özel bir diziye ve kaç öğenin depolandığını takip eden birCountö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 birGetAll()yöntemine sahip olmalı
- Öğ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 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: HelloStorage<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)}
}
}
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