|
1. System. Object sinfi va uning usullari Umumlashtirish
|
bet | 9/12 | Sana | 18.05.2024 | Hajmi | 70,5 Kb. | | #241174 |
Bog'liq 22-09Usul cheklovlari. Usul cheklovlari xuddi shunday tarzda ishlatilishi mumkin:
private static void Main(string[] args)
{
Account acc1 = new Account(1857) { Sum = 4500 };
Account acc2 = new Account(3453) { Sum = 5000 };
Transact(acc1, acc2, 900);
Console.Read();
}
public static void Transact(T acc1, T acc2, int sum) where T : Account
{
if (acc1.Sum > sum)
{
acc1.Sum -= sum;
acc2.Sum += sum;
}
Console.WriteLine($"acc1: {acc1.Sum} acc2: {acc2.Sum}");
}
Transact usuli cheklash sifatida Account turini oladi.
4. Umumiy turdagi meros
Bitta umumiy sinf boshqa umumlashgandan meros bo'lishi mumkin. Bunday holda, siz meros uchun turli xil variantlardan foydalanishingiz mumkin.
Aytaylik, bizda quyidagi asosiy Account sinfi mavjud:
class Account
{
public T Id { get; private set; }
public Account(T _id)
{
Id = _id;
}
}
Birinchi variant - asosiy sinf bilan bir xil turdagi terilgan hosila sinf yaratish:
class UniversalAccount : Account
{
public UniversalAccount(T id) : base(id)
{
}
}
Sinfga murojaat qilish:
Account acc1 = new Account("34");
Account acc3 = new UniversalAccount(45);
UniversalAccount acc2 = new UniversalAccount(33);
Console.WriteLine(acc1.Id);
Console.WriteLine(acc2.Id);
Console.WriteLine(acc3.Id);
Ikkinchi variant - odatiy umumlashtirilmagan merosxo'r sinfini yaratish. Bunday holda, asosiy sinfdan meros bo'lib o'tayotganda, foydalaniladigan turni aniq belgilashingiz kerak:
class StringAccount : Account
{
public StringAccount(string id) : base(id)
{
}
}
Olingan sinf endi string turini tur sifatida ishlatadi. Sinfga murojaat qilish:
StringAccount acc4 = new StringAccount("438767");
Account acc5 = new StringAccount("43875");
// siz bunday yozolmaysiz
//Account acc6 = new StringAccount("45545");
Uchinchi variant esa olingan sinfni asosiy sinfdagi umumiy parametrdan mutlaqo boshqa turdagi parametr bilan yozishni ifodalaydi. Bunday holda, asosiy sinf uchun ishlatiladigan tur ham ko'rsatilishi kerak:
class IntAccount : Account
{
public T Code { get; set; }
public IntAccount(int id) : base(id)
{
}
}
Bu yerda IntAccount turi boshqa tur bilan yoziladi, u asosiy sinf tomonidan ishlatiladigan turga mos kelmasligi mumkin. Sinfga murojaat qilish:
IntAccount acc7 = new IntAccount(5) { Code = "r4556" };
Account acc8 = new IntAccount(7) { Code = 4587 };
Console.WriteLine(acc7.Id);
Console.WriteLine(acc8.Id);
Shuningdek, meros qilib olingan sinflarda siz asosiy sinfdan umumiy parametrdan foydalanishni parametrlaringiz bilan birlashtirishingiz mumkin:
class MixedAccount : Account
where K : struct
{
public K Code { get; set; }
public MixedAccount(T id) : base(id)
{
}
}
Bu yerda asosiy sinfdan meros bo'lib qolgan T parametriga qo'shimcha ravishda yangi K parametr qo'shiladi.Shuningdek, agar cheklovlar o'rnatish zarur bo'lsa, ularni asosiy sinf nomidan keyin ko'rsatishimiz mumkin. Sinfga murojaat qilish:
MixedAccount acc9 = new MixedAccount("456") { Code = 356 };
Account acc10 = new MixedAccount("9867") { Code = 35678 };
Console.WriteLine(acc9.Id);
Console.WriteLine(acc10.Id);
Shuni yodda tutish kerakki, agar asosiy sinf darajasida umumiy parametr uchun cheklov o'rnatilgan bo'lsa, u holda ushbu parametrdan foydalanadigan hosila sinflarda ham shunga o'xshash cheklash aniqlanishi kerak:
class Account where T : class
{
public T Id { get; private set; }
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 cheklash sifatida ko'rsatilgan bo'lsa, hosil bo'lgan sinfda ham class ni cheklash yoki biron bir maxsus sinf sifatida ko'rsatish kerak.
|
| |