Kontravariant interfeyslar Kalit so'zni foydalanish uchun contravariant interfeysi zarurligini yaratish uchun ham . Misol uchun, bir xil Hisob va DepositAccount sinflarini oling va quyidagi turlarni aniqlang:
interface ITransaction
{
void DoOperation(T account, int sum);
}
class Transaction : ITransaction where T : Account
{
public void DoOperation(T account, int sum)
{
account.DoTransfer(sum);
}
}
U shartli bank operatsiyasini ifodalovchi ITransaction interfeysini belgilaydi. Kalit so'z bilan bir interfeysi belgilash interfeysi contravariant ekanligini ko'rsatadi. Interfeys DoOperation usulini belgilaydi, u ba'zi hisoblarni oladi va unda operatsiyani bajaradi.
Transaction klassi ushbu interfeysni amalga oshiradi va uning DoOperation usulini amalga oshiradi.
Keling, 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();
}
ITransaction interfeysi kalit so'z bilan umumiy parametrdan foydalanganligi sababli, u kontravariantdir in, shuning uchun kodda biz ob'ektni Transactionturiga o'tkazishimiz mumkin ITransaction:
ITransaction depAccTransaction = new Transaction();
Kalit so'z bo'lsa ham u ishlatilgan emas, keyin, biz bir ruh kabi amalga oshirish imkoniyatiga ega bo'lmaydi. Ya'ni, umumiyroq turdagi interfeys ob'ekti aniqroq turdagi interfeys ob'ektiga o'tkaziladi.
Kontravariant interfeysni yaratishda shuni yodda tutingki, kontravariant turdagi umumiy parametr faqat usul argumentlariga qo'llanilishi mumkin, lekin qaytarish turlari sifatida ishlatiladigan argumentlarga qo'llanilmaydi.
Statik ravishda terilgan tillarda konteyner sinflarini yaratishda har bir ma'lumot turi uchun maxsus dasturlarni yozish noqulay, ayniqsa har bir ma'lumot turi uchun kod deyarli bir xil bo'lsa. Masalan, C ++ da kodning takrorlanishini sinf shablonini aniqlash orqali chetlab o'tish mumkin:
shablon sinf Ro'yxat { // Sinf mazmuni.};Ro'yxat jonivorlar ro'yxati;Ro'yxat avtomobillar ro'yxati;
Yuqorida, T ro'yxat tuzilganda ko'rsatilgan har qanday tur uchun joy to'ldiruvchidir. Odatda "T-konteynerlar" andozalar, kabi ba'zi shartnomalar mavjud bo'lganda, sinfni turli xil ma'lumotlar turlari bilan qayta ishlatishga ruxsat bering subtiplar va imzo saqlanadi. Ushbu saxiylik mexanizmi bilan aralashmaslik kerak inklyuziya polimorfizmi, bu algoritmik almashinadigan kichik sinflardan foydalanish: masalan, turdagi ob'ektlar ro'yxati Moving_Object tipdagi narsalarni o'z ichiga olgan Hayvon va Avtomobil. Shablonlardan, kabi bo'lgani kabi, turga bog'liq bo'lmagan funktsiyalar uchun ham foydalanish mumkin lmashtirish quyida keltirilgan misol:
// "&" parametrlarga mos yozuvlar orqali o'tadishablon bekor Almashtirish(T& a, T& b) { T temp = b; b = a; a = temp;}std::mag'lubiyat Salom ="Dunyo!";std::mag'lubiyat dunyo="Salom, ";Almashtirish(dunyo, Salom);std::cout << Salom << dunyo << std::endl; // Chiqish "Salom, dunyo!".
C ++ shablon Yuqorida keltirilgan konstruktsiya keng keltirilgan[iqtibos kerak] dasturchilar va til dizaynerlari o'rtasida tushunchani ommalashtirgan va ko'plab umumiy dasturiy idiomalarni qo'llab-quvvatlaydigan saxiylik konstruktsiyasi sifatida. D dasturlash tili, shuningdek, C ++ pretsedentiga asoslangan, ammo soddalashtirilgan sintaksisga asoslangan to'liq umumiy shablonlarni taqdim etadi. Java dasturlash tili kiritilganidan beri C ++ ga asoslangan sintaktik ravishda genericity imkoniyatlarini taqdim etdi J2SE 5.0.
C # 2.0, Oksigen 1.5 (Chrome nomi bilan ham tanilgan) va Visual Basic .NET 2005 da mavjud bo'lgan genericlarni qo'llab-quvvatlashidan foydalanadigan konstruktsiyalar mavjud Microsoft .NET Framework 2.0 versiyasidan beri.
Ada shahridagi umumiy narsalar
Ada 1977-1980 yillarda birinchi marta ishlab chiqilganidan beri umumiy narsalarga ega. Standart kutubxona ko'plab xizmatlarni ko'rsatish uchun umumiy vositalardan foydalanadi. Ada 2005 standart kutubxonaga keng qamrovli umumiy konteyner kutubxonasini qo'shadi, bu C ++ dan ilhomlangan standart shablon kutubxonasi.
A umumiy birlik bir yoki bir nechtasini oladigan paket yoki subprogramdir umumiy rasmiy parametrlar.
A umumiy rasmiy parameter qiymati, o'zgaruvchisi, doimiysi, turi, pastki dasturi yoki hattoki boshqa, belgilangan, umumiy birlikning misoli. Umumiy rasmiy turlar uchun sintaksis diskret, suzuvchi nuqta, sobit nuqta, kirish (ko'rsatgich) turlari va boshqalarni ajratib turadi. Ba'zi rasmiy parametrlar standart qiymatlarga ega bo'lishi mumkin.
Kimga tayyorlamoq umumiy birlik, dasturchi o'tadi haqiqiy har bir rasmiy uchun parametrlar. Keyinchalik umumiy misol har qanday birlik kabi o'zini tutadi. Da umumiy birliklarni yaratish mumkin ish vaqti, masalan, pastadir ichida.
Do'stlaringiz bilan baham: |