1. Umumlashgan delegatlar Xuddi metodlar kabi delegatlar ham umumlashgan bo`lishi mumkin. Pastda umumlashgan delegatni aniqlashning umumiy shakli keltirilgan.
delegate qaytariluvchi_natija_tipi delegate_nomi
(argumentlar_ro_yxati) Parametrlar tiplari ro'yxatining joylashishiga e'tibor bering. U delegat nomidan keyin to'g'ridan-to'g'ri keladi. Umumlashgan delegatlarning afzalligi shundaki, ular keyinchalik har qanday ular bilan bir xil tipda aniqlangan umumlashgan metod bilan mos kelishi mumkin.
Quyidagi misolida T tipli bitta parametrga SomeOp delegatining qo'llanilishinikeltirilgan. Ushbu delegat T tipdagi qiymatni qaytaradi va T tipda argument qabul qiladi.
// delegatga oddiy misol. using System; // umumlashgan delegatning e`lon qilinishi, delegate T SomeOp(T v); class GenDelegateDemo { // argument yig`indisini qaytarish, static int Sum(int v) { int result = 0; for(int i=v; i>0; i--) result += i; return result; } // berilgan argumentning teskari tartibidan hosil bo`lgan satrni qaytarish static string Reflect(string str) { string result = ""; foreach(char ch in str) result = ch + result; return result; } static void Main() { // int tipidagi delegatni tuzish. SomeOp intDel = Sum; Console.WriteLine(intDelC)); // string tipidagi delegatni tuzish. SomeOp strDel = Reflect; Console.WriteLine(strDel("Привет") ) ; } } Ushbu dastur quyidagi natijani beradi.
6 тевирП Keling, ushbu dasturni batafsil ko'rib chiqaylik. Avvalo, SomeOp delegatining keyingi e'loniga e'tibor beraylik.
delegate T SomeOp(T v); Ko'rib turganidek, SomeOp delegate nomidan keyinturgan bo`lsada T tip qaytariluvchi natijaning tipi hisoblanadi.
Bundan tashqari, GenDelegateDemo sinfida quyida ko'rsatilganidek, Sum() va Reflect() metodlari e'lon qilgan.
static int Sum(int v) { static string Reflect(string str) { Sum() metodi argument sifatida uzatilgan butun qiymatga mos yig`indini natija sifatida qaytaradi, va Reflect() metodi— argument sifatida uzatilgan belgili qatorni teskarisiga aylantiradi.
Main() metodida Sum() metodiga havola berilgan delegatning intDel nusxasi yaratiladi.
SomeOp intDel = Sum; Sum() metodi int tipidagi argument qabul qiladi va shu tipda qiymat qaytaradi, shuning uchun u SomeOp delegatning butun tipli nusxasi bilam mos mos tushadi.
Xuddi shunday, Reflect() metodiga havola berilgan delegatning strDel misoli ham yaratiladi.
SomeOp strDel = Reflect; Reflect() metodi string tipidagi argument qabul qiladi va shu tipda qiymat qaytaradi, shuning uchun u SomeOp delegatning butun tipli nusxasi bilam mos mos tushadi.
Umumiy xavfsizlikka xos umumlashmalarda ham umumlashgan delegatlarga mos kelmaydigan metodlar berilmaydi. Shunday qilib, kodning keyingi satrida ko'rib chiqilayotgan dasturda xatolik bor.
SomeOp intDel = Reflect; // Xatolik! Axir, Reflect() metodi argument sifatida string tipida qiymat qabul qiladi va shu tipda natija qaytaradi, shuning uchun SomeOp delegatga butun tip mos kelmaydi.