Namangan davlat universiteti matematika fakulteti


Umumlashgan turlar haqida ma’lumot



Yüklə 48,85 Kb.
səhifə4/9
tarix08.06.2023
ölçüsü48,85 Kb.
#127141
1   2   3   4   5   6   7   8   9
Alibekov Kamoliddin kurs ishi 3

Umumlashgan turlar haqida ma’lumot.
Umumiy turlarga qo'shimcha ravishda, .NET ramkasi umumiy turlarni (generics) va umumiy usullarni yaratishni ham qo'llab-quvvatlaydi. Ushbu hodisaning o'ziga xos xususiyatlarini tushunish uchun, avvalo, umumiy tiplar paydo bo'lishidan oldin paydo bo'lgan muammoni ko'rib chiqaylik. Keling, bir misolni ko'rib chiqaylik. Aytaylik, foydalanuvchi ma'lumotlarini saqlash uchun sinfni aniqlaymiz:
class Person
{
public int Id { get;}
public string Name { get;}
public Person(int id, string name)
{
Id = id;
Name = name;
}
}

Person sinfi ikkita xususiyatni belgilaydi: Id - foydalanuvchi uchun noyob identifikator va Name - foydalanuvchi nomi.


Bu yerda foydalanuvchi identifikatori raqamli qiymat sifatida o'rnatiladi, ya'ni u 1, 2, 3, 4 va hokazo qiymatlar bo'ladi.
Biroq, identifikator uchun satr qiymatlaridan foydalanish ham keng tarqalgan. Raqamli va satr qiymatlari o'zlarining ijobiy va salbiy tomonlariga ega. Sinfni yozish paytida biz identifikatorni saqlash uchun nimani tanlash yaxshiroq ekanligini aniq bilmasligimiz mumkin - satr yoki raqam. Yoki, ehtimol, bu sinfdan ushbu muammo bo'yicha o'z fikriga ega bo'lgan boshqa ishlab chiquvchilar tomonidan foydalaniladi, masalan, identifikatorni ifodalash uchun maxsus sinf yaratishi mumkin. Bir qarashda bu vaziyatdan chiqish uchun Id xossasini o_bject tipidagi xususiyat sifatida belgilashimiz mumkin. object turi universal tip bo'lib, barcha turlar mos ravishda meros bo'lib o'tadi, biz ushbu turdagi xususiyatlarda satrlarni ham, raqamlarni ham saqlashimiz mumkin:
class Person
{
public object Id { get;}
public string Name { get;}
public Person(object id, string name)
{
Id = id;
Name = name;
}
}

Keyinchalik bu sinf dasturda foydalanuvchilarni yaratish uchun ishlatilishi mumkin:


Person tom = new Person(546, "Tom");
Person bob = new Person("abc123", "Bob");
int tomId = (int)tom.Id;
string bobId = (string) bob.Id;
Console.WriteLine(tomId); // 546
Console.WriteLine(bobId); // abc123

Har bir narsa ajoyib ishlayotganga o'xshaydi, lekin bu yechim juda maqbul emas. Gap shundaki, bu holda biz jamlash (boxing) va yoyish (unboxing) kabi hodisalarga duch kelamiz.


Shunday qilib, int tipidagi qiymat konstruktorga o'tkazilganda, bu qiymat Object turiga to'planadi:
Person tom = new Person(546, "Tom"); // int qiymatlarini Object turiga joylashtirish

Ma'lumotni int turdagi o'zgaruvchiga qaytarish uchun siz quyidagilarni ochishingiz kerak:


int tomId = (int) tom.Id; // int turiga ochish

Jamlash(boxing) qiymat turidagi ob'ektni (masalan, int) object turiga aylantirishni o'z ichiga oladi. Qadoqlashda umumiy tilning ish vaqti (CLR) qiymatni System.Object tipidagi ob'ektga jamlab oladi va uni boshqariladigan heapda saqlaydi. Boshqa tomondan, yoyish (unboxing) object tipidagi ob'ektni qiymat turiga aylantirishni o'z ichiga oladi. Jamlash va yoyish unumdorlikni pasaytiradi, chunki tizim kerakli o'zgarishlarni amalga oshirishi kerak.


Bundan tashqari, yana bir muammo bor - turdagi xavfsizlik muammosi. Shunday qilib, agar biz shunday yozsak, ish vaqti xatosiga duch kelamiz:
Person tom = new Person(546, "Tom");
string tomId = (string)tom.Id; // ! Xato – InvalidCastException istisno holati.
Console.WriteLine(tomId); // 546

Biz qaysi ob'ekt Id ni ifodalashini bilmasligimiz mumkin va bu holda raqam olishga urinayotganda InvalidCastExceptionga duch kelamiz. Bundan tashqari, dasturni bajarish bosqichida biz istisnoga duch kelamiz.


Ushbu muammolarni hal qilish uchun C# ga umumiy turlarni qo'llab-quvvatlash (ko'pincha umumiy turlar deb ham ataladi) qo'shildi. Umumiy turlar foydalanish uchun ma'lum bir turni belgilash imkonini beradi. Shuning uchun, keling, Person sinfini umumiy sifatida aniqlaymiz:
class Person
{
public T Id { get; set; }
public string Name { get; set; }
public Person(T id, string name)
{
Id = id;
Name = name;
}
}

class Person tavsifidagi burchakli qavslar sinf umumiy ekanligini bildiradi va burchakli qavslar ichiga olingan T turi bu sinf tomonidan qo'llaniladi. T harfini ishlatish shart emas, u boshqa har qanday harf yoki belgilar to'plami bo'lishi mumkin. Kodni yozish bosqichida, biz qanday turdagi bo'lishini bilmaymiz, u har qanday turdagi bo'lishi mumkin. Shuning uchun burchakli qavslardagi T parametri umumiy parametr deb ham ataladi, chunki uni har qanday turdagi almashtirish mumkin.


Masalan, T parametri o'rniga int ob'ektidan, ya'ni foydalanuvchi raqamini ifodalovchi raqamdan foydalanish mumkin. Shuningdek, u string ob'ekti yoki boshqa sinf yoki struktura bo'lishi mumkin:
Person tom = new Person(546, "Tom"); // jamlash shart emas
Person bob = new Person("abc123", "Bob");
int tomId = tom.Id; // yoyish shart emas
string bobId = bob.Id; // har qanday turdagi konvertatsiya kerak emas
Console.WriteLine(tomId); // 546
Console.WriteLine(bobId); // abc123

Person sinfi umumiy bo‘lgani uchun burchakli qavslar ichida tur nomidan keyin o‘zgaruvchini belgilashda T umumiy parametri o‘rniga ishlatiladigan turni ko‘rsatish kerak. Bu holda Person obyektlari int va string tiplari bilan yoziladi:


Person tom = new Person(546, "Tom");//jamlash talab qilinmaydi
Person bob = new Person("abc123", "Bob");

Shuning uchun birinchi tom obyekti int tipidagi Id xususiyatiga, bob obyekti esa string tipiga ega bo‘ladi. int turi bo'lsa, boks bo'lmaydi.


Agar biz id parametri uchun boshqa turdagi qiymatni o'tkazishga harakat qilsak, biz kompilyatsiya xatosini olamiz:
Person tom = new Person("546", "Tom");// kompilyatsiya xatoligi

Id dan qiymat olishda, biz endi matn terish operatsiyasiga muhtoj emasmiz va o'rash jarayoni ham qo'llanilmaydi:


int tomId = tom.Id; // yoyish talab qilinmaydi

Bu turdagi xavfsizlik muammolarini oldini oladi. Shunday qilib, sinfning umumiy versiyasidan foydalanib, biz bajarish vaqtini va yuzaga kelishi mumkin bo'lgan xatolar sonini kamaytiramiz.


Biroq, umumiy parametr umumiy turni ham ifodalashi mumkin:
// sinf kompaniyasi
class Company

{
public P CEO { get; set; } // kompaniya prezidenti
public Company(P ceo)
{
CEO = ceo;
}
}
class Person
{
public T Id { get;}
public string Name { get;}
public Person(T id, string name)
{
Id = id;
Name = name;
}
}

Bu yerda kompaniya sinfi kompaniya prezidentiga tegishli bo'lgan bosh direktor mulkini belgilaydi. Va biz ushbu xususiyat uchun ba'zi bir tur bo'yicha kiritilgan Person tipidagi qiymatni o'tkazishimiz mumkin:


Person tom = new Person(546, "Tom");
Company
> microsoft = new Company
>(tom);

Console.WriteLine(microsoft.CEO.Id); // 546
Console.WriteLine(microsoft.CEO.Name); // Tom



Yüklə 48,85 Kb.

Dostları ilə paylaş:
1   2   3   4   5   6   7   8   9




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin