Amaliy mashg’ulot: Umumlashgan turlar vorisligi. Tayanch so`z va iboralar

|
Amaliy mashg’ulot: Umumlashgan turlar vorisligi. Tayanch so`z va iboralar
|
bet | 1/3 | Sana | 07.12.2023 | Hajmi | 21,55 Kb. | | #113517 |
Bog'liq 1-мавзу Vorislik
Amaliy mashg’ulot: Umumlashgan turlar vorisligi.
Tayanch so`z va iboralar: umumlashgan sinflar, metodlar, hususiyatlar, operatorlar, delegatlar, interfeyslar.
Umumiy sinflar umumiy bo'lmagan sinflar singari sinf ierarxiyasiga kirishi mumkin. Shuning uchun umumiy sinf asos yoki hosil bo'lgan sinf vazifasini bajarishi mumkin. Umumiy va umumiy bo'lmagan sinflar ierarxiyalarining asosiy farqi shundaki, avvalgi holatda, umumiy bazaviy sinf talab qiladigan tip argumentlari konstruktor argumentlari singari ierarxiyadagi barcha olingan sinflar tomonidan o'tkazilishi kerak.
Bir umumiy sinf boshqa umumiy narsadan meros bo'lib o'tishi mumkin. Bunday holda siz meros olish uchun turli xil variantlardan foydalanishingiz mumkin.
|
classAccount
{
publicT Id { get; privateset; }
publicAccount(T _id)
{ Id = _id; }
}
|
Birinchi variant, asosiy bilan bir xil turdagi yozilgan avlod avlodini yaratishdir:
1
2
3
4
5
6
|
classUniversalAccount : Account
{
publicUniversalAccount(T id) : base(id)
{ }
}
|
Sinf uchun ariza:
1
2
3
4
5
6
|
Account acc1 = newAccount("34");
Account acc3 = newUniversalAccount(45);
UniversalAccount acc2 = newUniversalAccount(33);
Console.WriteLine(acc1.Id);
Console.WriteLine(acc2.Id);
Console.WriteLine(acc3.Id);
|
Ikkinchi variant - oddiy bo'lmagan umumiy merosxo'rlar sinfini yaratish. Bunday holda, asosiy sinfdan meros olayotganda, foydalaniladigan turni aniq belgilashingiz kerak:
1
2
3
4
5
6
|
classStringAccount : Account
{
publicStringAccount(stringid) : base(id)
{ }
}
|
Hosil qilingan sinf endi string sifatida stringni ishlatadi. Sinf uchun ariza:
1
2
3
4
|
StringAccount acc4 = newStringAccount("438767");
Account acc5 = newStringAccount("43875");
//Account acc6 = new StringAccount("45545");
|
Uchinchi variant, olingan sinfni asosiy sinfdagi umumiy parametrdan butunlay boshqa turdagi parametr bilan yozishni anglatadi. Bunday holda, asosiy sinf uchun ishlatiladigan tur ham ko'rsatilishi kerak:
1
2
3
4
5
6
7
|
classIntAccount : Account
{
publicT Code { get; set; }
publicIntAccount(intid) : base(id)
{ }
}
|
Bu yerda IntAccount turi boshqa tip tomonidan yoziladi, bu asosiy sinf foydalanadigan turga o'xshamasligi mumkin. Sinf uchun ariza:
1
2
3
4
|
int Account acc7 = new int Account(5) { Code = "r4556"};
Account acc8 = new int Account(7) { Code = 4587 };
Console.WriteLine(acc7.Id);
Console.WriteLine(acc8.Id);
|
Shuningdek, meros qilib olingan sinflarda siz umumiy parametrdan foydalanishni asosiy sinfdan o'zingizning parametrlaringiz bilan birlashtira olasiz:
|
class MixedAccount : Account
where K : struct
{
public K Code { get; set; }
public MixedAccount(T id) : base(id)
{ }
}
|
Bu yerda, asosiy sinfdan meros qolgan T parametridan tashqari, yangi K parametri ham qo'shiladi.Shuningdek, agar cheklovlar qo'yish zarur bo'lsa, ularni asosiy sinf nomidan keyin belgilashimiz mumkin. Sinf uchun ariza:
MixedAccount acc9 = newMixedAccount("456") { Code = 356 };
Account acc10 = newMixedAccount("9867") { Code = 35678 };
Console.WriteLine(acc9.Id);
Console.WriteLine(acc10.Id);
Shuni yodda tutish kerakki, agar umumiy parametr uchun asosiy sinf darajasida cheklov o'rnatilgan bo'lsa, unda ushbu parametrni ishlatadigan olingan sinflarda ham shunga o'xshash cheklash belgilanishi kerak:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Account where T : class
{
publicT Id { get; privateset; }
public Account(T _id)
{
Id = _id;
}
}
class UniversalAccount : Account
where T: class
{
public UniversalAccount(T id) : base(id)
{ }
}
|
Ya'ni, agar sinf asosiy sinfda, ya'ni har qanday sinfda cheklov sifatida ko'rsatilgan bo'lsa, u holda olingan sinfda sinfni cheklash sifatida yoki ba'zi bir aniq sinflarni ko'rsatish kerak.
Umumiy tayanch sinfidan foydalanish
Quyida umumiy bazaviy sinfdan foydalanadigan iyerarxiyaning oddiy misoli keltirilgan.
|
| |