Олий таълим ўқув режаларидаги фанларга



Download 4,03 Mb.
bet84/102
Sana23.02.2022
Hajmi4,03 Mb.
#136190
1   ...   80   81   82   83   84   85   86   87   ...   102
Bog'liq
Dasturlash asoslari majmua

static void Main()
{
Console.WriteLine( " Sin функциясининг жадвали." );
Table( Math.Sin, -2, 2 ); // 1-соддалаштириш


Console.WriteLine( " Simple функциясининг жадвали " );
Table( delegate (double x ){ return 1; }, 0, 3 ); // 2-соддалаштириш
}
}
}
Биринчи холда Sin функциясига мос келадиган делегат экземпляри тўғридан – тўғри яратилади. Бунинг содир бўлиши учун параметрлар ва функциянинг қайтариладиган маълумотлари типи делегат билан биргаликда бўлиши лозим. Иккинчи холда эса алоҳида Simple кўринишидаги функцияни тавсифловчи код парчасини тавсифлаш талаб қилинмайди. Функция коди худди аноним метод каби расмийлаштирилади ва узатиш ўрнига тўғридан – тўғри ёзиб қўйилади.

Ходиса


Ходиса — бу класс элементи бўлиб, унга бошқа объектларга ўз холати ҳақидаги маълумотларни (огохлантиришларни) узатишга имкон беради. Бундай Ходиса кузатувчилари бўлган объектлар учун бу ходисаларни қайта ишловчи методлар фаоллаштирилади. Қайта ишлагичлар ходиса объект-манбаада қайд қилинган бўлши зарур. Шундай қилиб, ходисалар механизми тиллар паттерн "Кузатувчи" даражасида шакллантирилади.
Ходисалар механизмини шунингдек “нашр-обуна” модели асосида ҳам тавсифлаш мумкин: маълумот жўнатувчи бўлган битта класс (sender) у юзага келтириши керак бўлган ходисани наш қилади, қабул қилувчи бўлган бошқа класслар (receivers) бу ходисаларни қабул қиьлиш учун обуна бўладилар.
Ходисалар делегатлар асосида қурилган: делегатлар ёрдамида ходисаларни қайта ишлагич методлар чақирилади. Шунинг учун классдаги ходисалар қуйидаги таркибий қисмлардан иборат бўлади:

  • ходисаларни қайта ишлагичларни тавсифловчи делегатларни шакллантириш;

  • Ходисалар тавсифи;

  • Ходисаларни юзага келтирувчи методлар тавсифи.

Ходисалар синтаксиси делегатлар синтаксисига ўхшайди:
[ атрибутлар] [ спецификаторлар] event тип Ходиса_nomi ходисалар учун
Унда new, public, protected, internal, private, static, virtual, sealed, override, abstract хамда extern каби спецификаторлар қўлланилади. Масалан, методлар каби ходисалар ҳам статик ( static ) бўлиши мумкин, бу холда у класс билан тўлалигича боғланган, ёки оддий – у класс экземпляри билан боғланган бўлади. Ходиса типи — бу ходисага асосланган делегат типи ҳисобланади.
Делегат ва унга мос ходисани тавсифлаш:
public delegate void Del( object o ); // делегат эълон қилиш
class A
{
public event Del Oops; // Ходиса эълон қилиш
...
}
Ходисаларни қайта ишлаш маълумотларни қайта ишлаш класслари ёрдамида амалга оширилади. Бунинг учун уларда сигнатуралари делегат типига мос келувчи ходисаларни қайта ишлагичлар тавсифланади. Маълумот олишни истаган ҳар бир объект (класс эмас!) жўнатувчи объектда шу методни қайд эттириши зарур.
Ходисалардан фойдаланганда қайта ишлагичларни қайд этувчи методни тавсифлаш шарт эмас, чунки ходиса қўшиш (+= ) хамда ўчириш (-=) амалларини қўллаб - қувватлайди .
25.4- листингда 25.2-листингдаги кодни ходисалар ёрдамида қайта ишланган варианти келтирилган. 25.2-расм эса ходисаларни қайта ишлагичлар ишини изохлаб беради.

25.2-расм. Иккита нолли коэффициентли дастурнинг бажарилиши

25.4-листинг. Ходисалар ёрдамида кузатувчиларни огохлантириш


using System;
namespace ConsoleApplication1
{
public delegate void Del(); // эълон қилиш делегата
class Subj // класс-манбаа
{
public event Del Oops; // эълон қилиш Ходиса
public void CryOops() // ходисани шакллантирувчи метод
{
Console.WriteLine( "ОЙ!" );
if ( Oops != null ) Oops();
}
}
class ObsA // класс-Кузатувчи
{
public void Do(); // Ходиса манбаага реакция
{
Console.WriteLine( "Бечора !" );
}
}
class ObsB // класс-Кузатувчи
{
public static void See() // Ходиса манбаа реакция
{
Console.WriteLine( "Ха бу арзимаган гап !" );
}
}
class Class1
{
static void Main()
{
Subj s = new Subj(); // класс-манбаа объекти
ObsA o1 = new ObsA(); // кузатувчи класс объектлари
ObsA o2 = new ObsA(); // кузатувчи класс объектлари
s.Oops += new Del( o1.Do ); // ходисаларни қайта ишлагичлар
s.Oops += new Del( o2.Do ); // қўшиш
s.Oops += new Del( ObsB.See ); //
s.CryOops(); // Ходисани юзага келтириш
}
}
}
Ташқи код ходисалар билан ягона усулда ишлаши мумкин: ходисаларни қайта ишлагичларн рўйхатга қўшиш ёки уларни ўчириш, чунки классдан ташқарида фақат += хамда -= амаллари бажарилиши мумкин холос. Бу амаллар натижасининг типи void.
Ичида ходиса тавсифланган класс ичида уларга худди делегат типига эга бўлган оддий майдонлар каби мурожаат қилиш, таққослаш, ўзлаштириш каби амалларни бажариш мумкин. Ходисаларнинг тўғридан – тўғри типи — null.
.NET кутубхонасида ходисаларни қайта ишлагичлар учун мўлжалланган катта сондаги стандарт делегатлар тавсифланган. Бу классларнинг кўпчилиги бир хил қоида остида расмийлаштирилган:

  • Делегат номи EventHandler суффикси билан тугайди ;

  • делегат иккита параметр олади:

    • биринчи параметр ходиса мабаасини кўрсатади ва object типига эга бўлади ;

    • иккинчи параметр ходисаларнинг аргументларини ифодалайди ва EventArgs ёки ундан ҳосила типга эга бўлади.

Агар ходисаларни қайта ишлагичларга ходиса ҳақидаги специфик маълумотлар талаб қилинса у холда бунинг учун EventArgs стандарт классининг ҳосиласи бўлган класс яратилади ва унга зарур маълумотлар қўшилади. Агар делегат бундай маълумотлардан фойдаланмаса, у холда System.EventHandler делегатининг стандарт классидан фойдаланиш мумкин.
Ходисаларни қайта ишлагичларнинг номини On қўшимчаси ҳамда ходисанинг номи орқали аташ қабул қилинган. 25.5-листингда 25.4-листингдаги мисолни .NET стандарт келишувларига мувофиқ расмийлаштириш намунаси келтирилган.
25.5-листинг. Стандарт EventHandlerusing System делегатидан фойдаланиш;
namespace ConsoleApplication1
{
class Subj
{
public event EventHandler Oops;
public void CryOops()
{
Console.WriteLine( "ОЙ!" );
if ( Oops != null ) Oops( this, null );
}
}


class ObsA
{
public void OnOops( object sender, EventArgs e )
{
Console.WriteLine( "Бечора !" );
}
}


class ObsB
{
public static void OnOops( object sender, EventArgs e )
{
Console.WriteLine( "Ха бу арзимаган гап !" );
}
}


class Class1
{ static void Main()
{
Subj s = new Subj();
ObsA o1 = new ObsA();
ObsA o2 = new ObsA();
s.Oops += new EventHandler( o1.OnOops );
s.Oops += new EventHandler( o2.OnOops );
s.Oops += new EventHandler( ObsB.OnOops );
s.CryOops();
}
}
}

    1. Download 4,03 Mb.

      Do'stlaringiz bilan baham:
1   ...   80   81   82   83   84   85   86   87   ...   102




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

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish