8 Umumiy interfeyslarning kovaryansi va ziddiyatliligi.
Kovariatsiya va qarama-qarshi tushunchalar ma'lum bir tur o'rniga, meros ierarxiyasida past yoki undan yuqori bo'lgan boshqa turni qo'llashda foydalanish qobiliyati bilan bog'liq.
Uchta xatti-harakatlar mavjud:
1.Covariance: avval o'rnatilganidan ko'ra ko'proq aniq turdan foydalanishga imkon beradi.
2.Qarama-qarshilik: sizga avvalgidan ko'ra universalroq turdan foydalanish imkonini beradi.
3.Invariance: faqat berilgan turdan foydalanishga imkon beradi.
C # kovariant va qarama-qarshi bo'lgan umumiy interfeyslarni yaratishga imkon beradi. Ushbu funktsionallik dasturda umumiy interfeyslardan foydalanganda moslashuvchanlikni oshiradi. Odatiy bo'lib, barcha umumiy interfeyslar, masalan, IAccout , o'zgarmasdir.
Kovariant va qarama-qarshi interfeyslarni ko'rib chiqish uchun biz quyidagi sinflarni olamiz:
class Account
{
public virtual void DoTransfer(int sum)
{
Console.WriteLine($"Клиент положил на счет {sum} долларов");
}
}
class DepositAccount : Account
{
public override void DoTransfer(int sum)
{
Console.WriteLine($"Клиент положил на депозитный счет {sum} долларов");
}
}
|
Bu erda biz odatiy hisob klassi - Hisob qaydnomasi va undan meros qilib olingan DepositAccount sinfini aniqlaymiz. Hisob qaydnomasi sinfi hisobda shartli operatsiyani bajaradigan usulni belgilaydi. DepositAccount klassi ushbu interfeysni biroz o'zgartiradi.
Kovariant interfeyslari
Agar umumiy kalit so'z umumiy parametrga qo'llanilsa, umumiy interfeyslar kovariant bo'lishi mumkin. Masalan:
interface IBank
{
T CreateAccount(int sum);
}
class Bank : IBank where T : Account, new()
{
public T CreateAccount(int sum)
{
T acc = new T(); // создаем счет
acc.DoTransfer(sum);
return acc;
}
}
|
Umumiy IBank interfeysi hisob yaratish uchun CreateAccount usulini belgilaydi. Bundan tashqari, interfeysni aniqlash vaqtida biz qaysi turdagi hisobni ko'rsatishini bilmaymiz. Interfeysni aniqlashdagi kalit so'z interfeys kovariant bo'lishini anglatadi.
Shartli bankni ifodalovchi Bank sinfi ushbu interfeysni amalga oshiradi va CreateAccount usulidan ob'ektni Hisob sinfi yoki uning avlodlaridan birini anglatadi.
Ushbu turlarni dasturda qo'llaymiz:
static void Main(string[] args)
{
IBank depositBank = new Bank();
Account acc1 = depositBank.CreateAccount(34);
IBank ordinaryBank = new Bank();
// или так
// IBank ordinaryBank = depositBank;
Account acc2 = ordinaryBank.CreateAccount(45);
Console.Read();
}
|
Ya'ni, biz ko'proq aniq turdagi IBank yoki Bank ob'ektini yanada kengroq turdagi IBank ga tayinlashimiz mumkin.
Shu bilan birga, agar biz kalit so'zni ishlatmagan bo'lsak:
keyin chiziqda xatoga duch kelamiz
IBank ordinaryBank = depositBank;
|
Chunki bu holda Bankning ob'ekti IBank turiga o'tkazib bo'lmaydi.
Kovariant interfeysini yaratishda universal parametr faqat interfeys usullari bilan qaytarilgan qiymat turi sifatida ishlatilishi mumkinligini yodda tutish kerak. Ammo uni metod argumenti turi yoki interfeys usullarini cheklash sifatida ishlatish mumkin emas.
Do'stlaringiz bilan baham: |