Masalan:
using System;
namespace qaytish_tipi_mosligi
{
delegate object ObjectRetriever();
class Test
{
static void Main()
{
ObjectRetriever o = new ObjectRetriever (RetrieveString);
object result = o();
Console.WriteLine (result); // guldasta
Console.ReadLine();
}
static string RetrieveString()
{
return "guldasta";
}
}
}
Dastur natijasi:
ObjectRetriever delegati object ni qaytarib olishni kutadi, ammo object ning kichik sinfini ham olish mumkin, chunki delegatlarning qaytish tiplari kovariantdir.
2.7 Hodisalar
Delegatlardan foydalanilganda, odatda ikkita mustaqil qism paydo bo'ladi: takrorlovchi va abonent.
Takrorlovchi - delegatlar maydonini o'z ichiga olgan bir tip.
Takrorlovchi delegatga murojaat qilib, qachon yetkazib berish kerakligini aniqlaydi.
Abonentlar - maqsadli qabul qilish metodlari.
Abonent takrorlovchi delegatidagi + = va - = operatsiyalaridan foydalanib, jarayonni qachon boshlash va to'xtatish to'g'risida qaror qabul qiladi. Abonent boshqa abonentlar haqida hech narsa bilmaydi va ularning ishlariga xalaqit bermaydi.
event konstruktsiyasi faqat “takrorlovchi / abonent” modeli tomonidan talab qilinadigan delegatlar imkoniyatlari to'plamini ochadi. Hodisalarning asosiy maqsadi - abonentlarning bir-biriga ta'sir qilishining oldini olish.
Hodisani e'lon qilishda kalit so'z hodisa delegati oldiga qo'yiladi:
public delegate void PriceChangedHandler (decimal oldPrice, decimal newPrice);
public class Broadcaster
{
public event PriceChangedHandler PriceChanged; // Hodisani e’lon qilish
}
Broadcaster tipidagi kod PriceChanged a'zosiga to'liq kirish huquqiga ega va uni delegat sifatida qabul qilishi mumkin.
Broadcaster tashqarisidagi kod faqat PriceChanged hodisasida + = va - = operatsiyalarni bajarishi mumkin.
"+ =" operatoridan foydalangan holda hodisaga qo’shilish;
"- =" operatori yordamida hodisani bekor qilish mumkin.
Hodisani boshqaradigan funksiya event handler deb ataladi. Hodisalarni ishlab chiqaruvchisi hodisa delegati e'lon qilgan imzoga ega bo'lishi kerak. Hodisalar handler funksiyasiga o'tkaziladigan argumentlarga ega bo'lishi mumkin. Ular static, virtual, sealed va abstract deb e'lon qilinishi mumkin. Agar abonent bo'lmasa, Hodisa lar ishlamaydi.
Misol:
using System;
namespace Hodisalar
{
public delegate void PriceChangedHandler (decimal oldPrice, decimal newPrice);
public class Stock
{
string symbol; decimal price;
public Stock (string symbol)
{ this.symbol = symbol; }
public event PriceChangedHandler PriceChanged;
public decimal Price
{
get
{
return price;
}
set
{
if (price == value) return; // hech narsa o'zgarmasa chiqadi
decimal oldPrice = price; price = value;
if (PriceChanged != null)
PriceChanged (oldPrice, price);
}
}
}
}
Do'stlaringiz bilan baham: |