Delegate void Message


Download 184.94 Kb.
bet2/11
Sana16.06.2023
Hajmi184.94 Kb.
#1516542
1   2   3   4   5   6   7   8   9   10   11
Bog'liq
Amaliyot ishi Dasturlash texnologiyalari

Hodisalar.
Hodisalar tizimga ma'lum bir harakat sodir bo'lganligi haqida signal beradi. Va agar biz ushbu harakatlarni kuzatishimiz kerak bo'lsa, biz shunchaki hodisalardan foydalanishimiz mumkin.
Masalan, bank hisobini tavsiflovchi quyidagi sinfni oling:
class Account
{
public int Sum { get; private set; }
public Account(int sum) => Sum = sum;
public void Put(int sum) => Sum += sum;
public void Take(int sum)
{
if (Sum >= sum)
{
Sum -= sum;
}
}
}
Konstruktorda biz Sum xususiyatida saqlanadigan dastlabki miqdorni o'rnatamiz. Put usulidan foydalanib, biz hisob raqamiga pul qo'shishimiz mumkin, Take usuli yordamida esa, aksincha, hisobdan pul olishimiz mumkin. Keling, dasturda sinfdan foydalanishga harakat qilaylik - hisob yarating, undan pul kiriting va yechib oling:
Account account = new Account(100);
account.Put(20);
Console.WriteLine($"Сумма на счете: {account.Sum}");
account.Take(70);
Console.WriteLine($"Сумма на счете: {account.Sum}");
account.Take(180);
Console.WriteLine($"Сумма на счете: {account.Sum}");
Konsol chiqishi:

Barcha operatsiyalar kutilganidek ishlaydi. Ammo biz foydalanuvchini uning operatsiyalari natijalari haqida xabardor qilmoqchi bo'lsak-chi. Buni amalga oshirish uchun, masalan, Put usulini o'zgartirishimiz mumkin:
public void Put(int sum)
{
Sum += sum;
Console.WriteLine($"На счет поступило: {sum}");
}
Endi konsolda tegishli xabarni ko'rish orqali biz operatsiya haqida xabardor bo'lishimiz kerak edi. Ammo bu yerda ba'zi izohlar mavjud. Sinfni aniqlash vaqtida biz pul qo'shishga javoban Put metodida qanday harakat qilishni xohlayotganimizni aniq bilmasligimiz mumkin. Bu konsolga chiqarilishi mumkin yoki biz foydalanuvchini elektron pochta yoki sms orqali xabardor qilishni xohlaymiz. Bundan tashqari, biz ushbu sinfni o'z ichiga olgan alohida sinf kutubxonasini yaratishimiz va uni boshqa loyihalarga qo'shishimiz mumkin. Va allaqachon ushbu loyihalardan qanday harakat qilish kerakligini hal qilish kerak. Hisob sinfidan grafik ilovada foydalanishni va konsolda emas, balki grafik xabarda qayd yozuviga qo'shilganda chiqishni xohlashimiz mumkin. Yoki bizning sinf kutubxonamizdan hisobni qo'shishda nima qilish kerakligi haqida o'z fikriga ega bo'lgan boshqa dasturchi foydalanadi. Va bu muammolarni hodisalar yordamida hal qilishimiz mumkin.
Hodisalar event kalit so'zidan keyin hodisani ifodalovchi delegat turi bilan sinfda e'lon qilinadi:
delegate void AccountHandler(string message);
event AccountHandler Notify;
Bunday holda, avvalo AccountHandler delegati aniqlanadi, u satr turining bir parametrini oladi. Keyin, event kalit so'zidan foydalanib, siz AccountHandler delegatini ifodalovchi Notify nomli hodisani belgilaysiz. Tadbirning nomi o'zboshimchalik bilan bo'lishi mumkin, lekin har qanday holatda u ba'zi delegatni ifodalashi kerak.
Hodisani aniqlagandan so'ng, biz uni dasturda hodisa nomidan foydalangan holda usul sifatida chaqirishimiz mumkin:
Notify("Произошло действие");
Notify hodisasi string turining bir parametrini - stringni qabul qiladigan AccountHandler delegatini ifodalaganligi sababli, hodisani chaqirganimizda, biz unga satrni o'tkazishimiz kerak.
Biroq, voqealarni ko'tarishda, agar u uchun aniqlangan ishlov beruvchi bo'lmasa, voqea null ekanligiga duch kelishimiz mumkin. Shuning uchun, hodisa chaqirilganda, uni har doim null uchun tekshirish yaxshidir. Masalan, bu kabi:
if(Notify !=null) Notify("Произошло действие");
Yoki shunday:
Notify?.Invoke("Произошло действие");
Bunday holda, hodisa delegatni ifodalaganligi sababli, parametrlar uchun kerakli qiymatlarni kiritib, uni Invoke() usuli yordamida chaqirishimiz mumkin.
Keling, barchasini birlashtiramiz va hodisa yaratamiz va ishga tushiramiz:
class Account
{
public delegate void AccountHandler(string message);
public event AccountHandler? Notify;
public Account(int sum) => Sum = sum;
public int Sum { get; private set; }
public void Put(int sum)
{
Sum += sum;
Notify?.Invoke($"На счет поступило: {sum}");
}
public void Take(int sum)
{
if (Sum >= sum)
{
Sum -= sum;
Notify?.Invoke($"Со счета снято: {sum}");
}
else
{
Notify?.Invoke($"Недостаточно денег на счете. Текущий баланс: {Sum}");
}
}
}
Endi biz tizimga mablag‘ qo‘shilganligi va hisobdan mablag‘ yechib olingani yoki hisobda mablag‘ yetarli emasligi haqida xabar berish uchun Notify hodisasidan foydalanamiz.
Hodisa bir yoki bir nechta ishlov beruvchiga ega bo'lishi mumkin. Hodisalar ishlovchilari aynan voqealar chaqirilganda bajariladigan narsadir. Ko'pincha usullar hodisa ishlov beruvchilari sifatida ishlatiladi. Parametrlar ro'yxati va qaytarish turi bo'yicha har bir hodisa ishlovchisi hodisani ifodalovchi delegatga mos kelishi kerak. Hodisa ishlov beruvchisini qo'shish uchun += operatoridan foydalaning:
Notify += voqea boshqaruvchisi;
Dasturda kerakli bildirishnomalarni olish uchun Notify hodisasi uchun ishlov beruvchilarni aniqlaymiz:
Account account = new Account(100);
account.Notify += DisplayMessage;
account.Put(20);
Console.WriteLine($"Сумма на счете: {account.Sum}");
account.Take(70);
Console.WriteLine($"Сумма на счете: {account.Sum}");
account.Take(180);
Console.WriteLine($"Сумма на счете: {account.Sum}");
void DisplayMessage(string message) => Console.WriteLine(message);
Bunday holda, DisplayMessage usuli ishlov beruvchi sifatida ishlatiladi, bu parametrlar ro'yxati va AccountHandler delegatiga qaytish turi bo'yicha mos keladi. Natijada, Notify?.Invoke() hodisasi chaqirilganda, DisplayMessage usuli chaqiriladi, unga xabar parametri Notify?.Invoke() ga uzatiladigan satr uzatiladi. DisplayMessage-da biz shunchaki voqeadan olingan xabarni ko'rsatamiz, ammo har qanday mantiqni aniqlash mumkin.
Agar bu holatda ishlov beruvchi o'rnatilmagan bo'lsa, Notify?.Invoke() hodisasi chaqirilganda hech narsa sodir bo'lmaydi, chunki Notify hodisasi null bo'ladi.
Dasturning konsol chiqishi:

Endi biz Account sinfini alohida sinf kutubxonasiga ajratishimiz va uni istalgan loyihaga qo'shishimiz mumkin.



Download 184.94 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9   10   11




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling