Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

[c#] Zasto koristiti delegate

[es] :: .NET :: .NET Desktop razvoj :: [c#] Zasto koristiti delegate

[ Pregleda: 11304 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Valerij Zajcev

Član broj: 40886
Poruke: 1374
*.dynamic.sbb.co.yu.



+2 Profil

icon [c#] Zasto koristiti delegate22.08.2007. u 12:53 - pre 202 meseci
Dobro, delegati su reference na metode OK, ali ne razumem zasto bi se to radilo ako mogu da pozovem metod kad god hocu. Moze li neko da navede neki razlog za upotrebu delegata?
PS
tek pocinjem sa ovim pa me zanima da unapred imam u glavi primenu ovoga, hvala unapred.
 
Odgovor na temu

dusty
Predrag Glumac
Zemun, Srbija

Član broj: 15383
Poruke: 549
*.adsl-1.sezampro.yu.

Sajt: www.mika.rs


+6 Profil

icon Re: [c#] Zasto koristiti delegate22.08.2007. u 13:06 - pre 202 meseci
Evo na primer event handling, pa neke asinhrone metode koje koriste callback za signaliziranje ......
America national sport is called baseballs. It very similar to our sport, shurik, where we take dogs, shoot them in a field and then have a party.
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12848



+4784 Profil

icon Re: [c#] Zasto koristiti delegate22.08.2007. u 15:19 - pre 202 meseci
Koriste se za prosledjivanja metode kao parametra. Znaci, u situaciji kada hoces da kazes nesto kao "evo, ovaj metod pozovi kad zatreba".
 
Odgovor na temu

maksvel

Član broj: 107376
Poruke: 2417

Jabber: maksvel
Sajt: maksvel.in.rs


+161 Profil

icon Re: [c#] Zasto koristiti delegate22.08.2007. u 19:08 - pre 202 meseci
Da, event-handling. Klasa ima događaj - event (koji je faktički delegat). Taj event je "profilisan" tako da poziva samo funkcije određenog tipa (potpisa). Različite klase koje reaguju na event se pretplaćuju na njega, potrebno je da imaju funkciju datog potpisa. Na taj način se te dve klase (publisher - sa event-om i subscriber - pretplatnik) povezuju tako da se lako mogu "raskačiti", a takođe i 1 event može imati proizvoljan broj pretplatnika... Inače, na ovaj način je u .NET "prirodno" ugrađen jedan od design pattern-a: publisher-subscriber. E, sad, asinhroni pozivi, callbackovi - to nek' pojasne guru-i
 
Odgovor na temu

dusty
Predrag Glumac
Zemun, Srbija

Član broj: 15383
Poruke: 549
*.smin.sezampro.yu.

Sajt: www.mika.rs


+6 Profil

icon Re: [c#] Zasto koristiti delegate23.08.2007. u 09:57 - pre 202 meseci
Citat:
maksvel: E, sad, asinhroni pozivi, callbackovi

Sem ezotericnog imena, nista posebno
Neke metode mogu da rade asinhrono, tj. metoda se pozove i ona odmah izadje i vraca se kontrola glavnom kodu. U pozadini asinhrone metode se obicno pokrene thread iz thread pool-a koji ce da radi neki proces. Takvoj metodi se prosledjuje callback delegat, metoda koja ce biti pozvana kada thread zavrsi.

Druga, mnogo zanimljivija stvar u vezi delegata je sto se oni mogu pozivati asinhrono. Svi delegati imaju metodu BeginInvoke (konstruise se dinamicki kako bi mogla da prihvati parametre metode) i EndInvoke, kojim se pokrece i zavrsava asinhrono izvrsavanje. Jedina stvar je sto metoda ciji delegat pravimo za asinhrono izvrsavanje ne sme da ima povratnu vrednost tj. povratni tip je void.
America national sport is called baseballs. It very similar to our sport, shurik, where we take dogs, shoot them in a field and then have a party.
 
Odgovor na temu

prog
Bihac

Član broj: 106882
Poruke: 77
*.PPPoE-7056.sa.bih.net.ba.



Profil

icon Re: [c#] Zasto koristiti delegate27.08.2007. u 20:13 - pre 202 meseci
i jos samo da dodam na ove kvalitetne odgovore prethodnika bez delegata cijeli .NET i programiranje za windows nebi imalo smisla jer su delegati zamjenili message handling u Win32 odnosno MFC.
 
Odgovor na temu

Pharos
Pančevo

Član broj: 20664
Poruke: 1029
83.209.23.*



+2 Profil

icon Re: [c#] Zasto koristiti delegate27.08.2007. u 20:58 - pre 202 meseci
Ma delegat ti je kao keva. U pocetku mozda ne shvatas, ali kad shvatis, vidis da je keva bila u pravu :D
77 77 77 2E 65 73 6E 69 70 73 2E 63 6F 6D
 
Odgovor na temu

Vreljanski Milan
Milan Vreljanski
Obrenovac

Član broj: 31700
Poruke: 121
80.93.234.*

Sajt: www.networks.co.yu


+2 Profil

icon Re: [c#] Zasto koristiti delegate08.09.2007. u 15:05 - pre 202 meseci
hahaha dobro je ovo za ke kevu.

Generalno problem je sto sve te koncepcije, pa i delegati imaju svrhi i primenu u odredjenim modelima i strukturama programiranja. A mi se sa time susrecemo retko(jer nam je struktura naucena priucena i urodjena) i onda nam, se cini koji ce mi ovo... a posle skontamo gde to pomaze i na koji nacin.

Elem treba slusati kevu
***If there is a will, there is a way***
 
Odgovor na temu

Boris Stevanovic
Srbija

Član broj: 1265
Poruke: 121
*.3dnet.co.yu.



Profil

icon Re: [c#] Zasto koristiti delegate09.09.2007. u 12:40 - pre 202 meseci
Lepa primena delegata je prosledjivanje parametara s jedne windows forme na drugu. Na codeprojectu ima dobar tutorijal o tome.
 
Odgovor na temu

Danko_C
Sabac-NSad

Član broj: 24156
Poruke: 181
*.vdial.verat.net.



+2 Profil

icon Re: [c#] Zasto koristiti delegate10.09.2007. u 13:54 - pre 202 meseci
Delegati-korisno svojstvo C#-a!!!

Delegati najcesce koristis prilikom obrade dogadjaja (event-a), kod programiranja Windows formi, ali ne samo tu. Najbolje je napraviti paralelu sa pokazivacima (pointer-ima) na funkciju u C i C++. Delegat je nesto slicno njima. Medjutim, dok ovi pokazivaci mogu da sadrze samo adresu STATICKE metode, delegat moze da referencira metode instanci u klasama. Mogu se koristiti uvek kada se unapred ne zna koja metoda treba da se pozove. Dogadjaji su, u principu, jedan tip delegata i njih koristis da posaljes informaciju da se na nekom objektu "nesto" dogodilo. To se mnogo koristi kod Windows formi kad treba npr. da posaljes informaciju da se nekom objektu forme dogodio nesto (npr. pritisak levog tastera misa na button OK u Windows formi).

Imaju dva tipa delegata-jednosmerni (single-cast) koji pozivaju samo jednu metodu i visesmerni (multi-cast) kojem se moze dodeliti vise metoda i oni ne mogu da vrate vrednost (u principu ponekad i mogu).
Kada se deklarise klasa, mozes napraviti i objekte delegata koje zatim koristis za pamcenje i pozivanje metoda sa odgovarajucim potpisom metode (tip koji metoda vraca i lista argumenata metode).

Delegati se realizuju u C#-u kroz klasu System.Delegate, koja moze da sadrzi i adresu instance klase kao i pokazivac na metodu.

Danko_C
 
Odgovor na temu

Belgarion
Novi Sad

Član broj: 245135
Poruke: 71
*.static.sbb.rs.



+2 Profil

icon Re: [c#] Zasto koristiti delegate14.12.2011. u 13:42 - pre 150 meseci
Evo poslednjih 5-6 sati sam proveo radeci delegate(po prvi put) i nije da ih nisam skontao ali nije ni da jesam.
Jos samo da skontam da je "keva u pravu".
Nije da imam neko pitanje. Samo sam iamo potrebu ovo da kazem nekome ko me razume :)
 
Odgovor na temu

nikitaGradov
Beograd

Član broj: 223576
Poruke: 206
92.244.132.*



+3 Profil

icon Re: [c#] Zasto koristiti delegate15.12.2011. u 09:47 - pre 150 meseci
I na ovom sajtu: http://www.akadia.com/services/dotnet_delegates_and_events.html, mozes procitati o delegatima.
U tekstu mozes pronaci sledecu recenicu: 'A delegate will allow us to specify what the function we'll be calling looks like without having to specify which function to call'.
Znaci, delegat 'pomaze' kada NIJE potrebno EKSPLICITNO pozvati funkciju, nego nam je vazno da znamo, kako pise u ovoj recenici: 'what the function we'll be calling looks like', ili da
to prevedemo na OO jezik: potrebno je navesti POTPIS pozvane funkcije.

Evo i jednog primjera: imao sam korisnicki zahtjev da se sa istog UI-a (user interface), radi sa razlicitim, da tako kazem, entitetima (recimo, kompanije i kontakti). Dakle, na istom UI-ju,
trebalo je odraditi funkcionalnosti tipa: Edit, Save, Delete, Print ... Znaci, ako dodajem novu kompaniju, klik na dugme 'Save', poziva metod za upis nove kompanije u bazu - isto i ako dodajem novi
kontakt za neku kompaniju. Ako sam editovao (bilo kompaniju, bilo kontakt), klik na 'Save' treba da pozove metod za 'Update' odgovarajucih podataka u bazi.
Znaci, mi ne znamo, unaprijed, koji ce metod biti pozvan klikom na dugme 'Save'. U eventhandler-u za dogadjaj Click, dugmeta 'Save', cemo upisati da se poziva metod odgovarajuceg potpisa (delegate).
Na drugom mjestu u programu cemo 'podmetnuti' zeljeni metod istog POTPISA kao i metoda, koji se ocekuje u eventhandler-u Click dogadjaja.

Evo i koda.

Kreiracemo klasu u kojoj cemo definisati delegat:
Code:

public class MediatorCompany_Person
    {
        public delegate void InsertObject(); //ovo je definicija delegata: to je metod bez parametara i bez povratne vrijednosti

        public InsertObject currentInsert; // referenca na metod, koji se poziva iz buttonSave.Click
    }

MediatorCompany_Person medComPer = new MediatorCompanyPerson();



Sam eventhandler, za dogadjaj Click, od dugmeta 'Save', izgleda ovako:
Code:

        // eventhandler za dugme save ...
        private void buttonSave_Click(object sender, EventArgs e)
        {
            // pozovi odgovarajucu funkciju iz medijatora
            if (medComPer.currentInsert != null)
                medComPer.currentInsert();
        }


Kao sto vidis, nije eksplicitno pozvan metod za: 'dodavanjeNoveKompanije', 'dodavanjeNovogKontakta', 'UpdatePostojeceKompanije' itd -> eksplicitno je pozvan metod, koji se u datom trenutku, zavisno
od logike programa, nalazi u 'currentInsert'.
Negdje u programu, zavisno od logike (konteksta) stoji, recimo da je:
Code:

medComPer.currentInsert = metodNovaKompanija;

ili:
Code:

medComPer.currentInsert = metodNoviKontakt;


Vazno je da metodNovaKompanija ima isti potpis kao i 'InsertObject' delegat iz definicije medijator klase, to jest da je bez parametara i da nema povratnu vrijednost:
Code:

void metodNovaKompanija()
{
// kod za 'insert' u bazu ...
}

Na taj nacin, logika programa obezbjedjuje da se u eventhandler-u UVIJEK poziva odgovarajuci metod, bez znanja koji je metod, zaista, EKSPLICITNO, pozvan.

Ovo moze da se uradi i bez delegata:
Code:

// eventhandler za dugme save ...
        private void buttonSave_Click(object sender, EventArgs e)
        {
         if (trebaUbacitiNovuKompaniju)
        metodNovaKompanija();
     else
        if (trebaUbacitiNoviKontakt)
                  metodaNoviKontakt();
            else
            if (trebaUpdateKompanija)
                            metodUpdateKompanija();
            else (...)
                ...
        }

Ako se, primjera radi, budu dodavale neke nove funkcionalnosti, moraces da dodajes novi if/else uslov u gore navedenom, visestrukom, 'if-else'-u, moraces da vodis racuna o set/reset bool promenljivih tipa
'terbaToiTo...', itd.

Primjenom delegata, u gornjem primjeru, kod za eventhandler se nikada nece mijenjati - u logici programa ces dodavati metode za nove funkcionalnosti i 'podmetati' ih u 'medComPer.currentInsert',
kao sto je navedeno u primjeru.
Programming is fun, but writing good software is hard ...
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: [c#] Zasto koristiti delegate

[ Pregleda: 11304 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.