Umumlashtirilgan usullar - 1. System. Object sinfi va uning usullari Umumlashtirish

|
1. System. Object sinfi va uning usullari Umumlashtirish
|
bet | 7/12 | Sana | 18.05.2024 | Hajmi | 70,5 Kb. | | #241174 |
Bog'liq 22-09Umumlashtirilgan usullar
Umumiy sinflarga qo'shimcha ravishda siz umumiy parametrlarni xuddi shu tarzda ishlatadigan umumiy usullarni ham yaratishingiz mumkin. Masalan:
class Program
{
private static void Main(string[] args)
{
int x = 7;
int y = 25;
Swap(ref x, ref y); // yoki Swap(ref x, ref y);
Console.WriteLine($"x={x} y={y}"); // x=25 y=7
string s1 = "hello";
string s2 = "bye";
Swap(ref s1, ref s2); // yoki Swap(ref s1, ref s2);
Console.WriteLine($"s1={s1} s2={s2}"); // s1=bye s2=hello
Console.Read();
}
public static void Swap (ref T x, ref T y)
{
T temp = x;
x = y;
y = temp;
}
}
U parametrlarni mos yozuvlar bo'yicha qabul qiladigan va ularning qiymatlarini o'zgartiradigan umumiy Swap usulini belgilaydi. Bundan tashqari, bu holda, bu parametrlar qaysi turni ifodalashi muhim emas.
Main usulida biz Swap usulini chaqiramiz, uni ma'lum bir tur bilan yozamiz va unga ba'zi qiymatlarni o'tkazamiz.
3.Umumlashganlarning cheklovlari
Umumiy turlarga cheklovlar. Umumiy parametrlar yordamida biz har qanday turdagi umumiy sinflarni yozishimiz mumkin. Biroq, ba'zida turni konkretlashtirish kerak bo'ladi. Masalan, bizda bank hisobini ifodalovchi quyidagi Account sinfi mavjud:
class Account
{
public int Id { get; private set;} // hisob raqami
public int Sum { get; set; }
public Account(int _id)
{
Id = _id;
}
}
Mablag'larni bir hisobdan ikkinchisiga o'tkazish uchun biz T_ransaction sinfini aniqlashimiz mumkin, bu sinfda barcha operatsiyalarni bajarish uchun A_ccount sinfi ob'ektlaridan foydalaniladi.
Ammo Account sinfi ko'plab merosxo'rlarga ega bo'lishi mumkin: DepositAccount (depozit hisobi), DemandAccount (talab hisobi) va boshqalar. Transaction sinfida qaysi hisob turlari ishlatilishini bila olmaymiz. Tranzaktsiyalar faqat talab hisobvaraqlari o'rtasida amalga oshirilishi mumkin. Va bu holda, Account turi umumiy parametr sifatida o'rnatilishi mumkin:
class Transaction where T: Account
{
public T FromAccount { get; set; } // qaysi hisobdan pul o'tkazmasi
public T ToAccount { get; set; } // pul o'tkazmasi qaysi hisob raqamiga
public int Sum { get; set; } // o'tkazma summasi
public void Execute()
{
if (FromAccount.Sum > Sum)
{
FromAccount.Sum -= Sum;
ToAccount.Sum += Sum;
Console.WriteLine($"Счет {FromAccount.Id}: {FromAccount.Sum}$ \nСчет {ToAccount.Id}: {ToAccount.Sum}$");
}
else
{
Console.WriteLine($"{FromAccount.Id} hisobida pul yetarli emas");
}
}
}
where T: Hisob ifodasidan foydalanib, biz foydalaniladigan T turi, albatta, Hisob sinfi yoki uning merosxo'ri bo'lishi kerakligini ko'rsatamiz. Ushbu cheklov tufayli biz Transaction sinfidagi barcha T tipidagi ob'ektlardan aynan A_ccount ob'ektlari sifatida foydalanishimiz va shunga mos ravishda ularning xususiyatlari va usullariga kirishimiz mumkin.
Endi dasturda Transaction sinfini qo'llaymiz:
class Program
{
static void Main(string[] args)
{
Account acc1 = new Account(1857) { Sum = 4500 };
Account acc2 = new Account(3453) { Sum = 5000 };
Transaction transaction1 = new Transaction
{
FromAccount = acc1,
ToAccount = acc2,
Sum = 6900
};
transaction1.Execute();
Console.ReadLine();
}
}
E'tibor bering, faqat bitta sinf cheklov sifatida ishlatilishi mumkin. Umumiy sinf cheklovchi sifatida ham harakat qilishi mumkin:
class Program
{
private static void Main(string[] args)
{
Account acc1 = new Account(1857) { Sum = 4500 };
Account acc2 = new Account(3453) { Sum = 5000 };
Transaction transaction1 = new Transaction
{
FromAccount = acc1,
ToAccount = acc2,
Sum = 6900
};
transaction1.Execute();
Console.Read();
}
}
class Account
{
public T Id { get; private set; } // номер счета
public int Sum { get; set; }
public Account(T _id)
{
Id = _id;
}
}
class Transaction where T: Account
{
public T FromAccount { get; set; } // qaysi hisobdan pul o'tkazmasi
public T ToAccount { get; set; } // pul o'tkazmasi qaysi hisob raqamiga
public int Sum { get; set; } // o'tkazma summasi
public void Execute()
{
if (FromAccount.Sum > Sum)
{
FromAccount.Sum -= Sum;
ToAccount.Sum += Sum;
Console.WriteLine($"Счет {FromAccount.Id}: {FromAccount.Sum}$ \nСчет {ToAccount.Id}: {ToAccount.Sum}$");
}
else
{
Console.WriteLine($"{FromAccount.Id} hisobida pul yetarli emas");
}
}
}
Bunday holda, Transaction sinfi Account sinfi tomonidan yoziladi. Account sinfi mutlaqo har qanday turda yozilishi mumkin. Biroq, Transaction sinfi faqat Account sinfining obyektlaridan yoki uning avlodlaridan foydalanishi mumkin. Ya'ni, quyidagi kod xato va ishlamaydi:
Account acc1 = new Account("34") { Sum = 4500 };
Account acc2 = new Account("45") { Sum = 5000 };
// buni yozib bo'lmaydi, chunki Bank Account sinfi yoki uning vorisi tomonidan kiritilishi kerak.
Transaction transaction1 = new Transaction
{
FromAccount = acc1,
ToAccount = acc2,
Sum = 900
};
Cheklov sifatida quyidagi turlardan foydalanishimiz mumkin:
|
| |