DELEGATI
Da biste shvatili pojam delegata u C# jeziku morate znati već malo više od početaka u C#-u ,
klase,objekte,metode itd....Ovo nije za početnike .Ovo je samo osvrt na puno pitanja o
delegatima koja mi se postavljaju kad netko počinje učiti C# ili recimo C++/CLI (CLR).
Dlegati se izvode u toku izvođenja(ispravak :)) tj. dinamički i tad se odlučuje koju metodu će pozvati.
Kod delegata se mora poštivati točno onako kako smo ga deklarirali, tako se i metode moraju
poklapati.Znači da se mora poštivati povratni tip delegata i metode kao i argumenti delegata
i metode.Znači oni su strogo specifični i zato sigurni pri pozivanju metode preko delegata.
Općenito :
public delegate (ovdje sad koji tip vraća) delegat_prvi(lista argumenata);
Znači :
public delegate void delegat_prvi(int a,int b);
Ova lista argumenata i povratni tip se mora poklapati sa metodom koju delegat poziva u toku
izvođenja programa !
Klasa s metodama static i instanca
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Delegat_CSharp
{
class DelegatskaKlasa
{
private int var;
public int Var
{
get { return var; }
}
public static void Funk1(int x)
{
Console.WriteLine("Pozvana je prva funkcija(metoda) {0}", x);
}
public static void Funk2(int x)
{
Console.WriteLine("Pozvana je druga funkcija(metoda) {0}", x);
}
public void Funk3(int x)
{
Console.WriteLine("Pozvana je treća funkcija(metoda) {0}", x + var);
}
public DelegatskaKlasa() { }
public DelegatskaKlasa(int x)
{
this.var = x;
}
}
}
Glavni program
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Delegat_CSharp
{
class Program
{
public delegate void Deleg(int vrijednost);
//ovdje deklariramo delegat Deleg
static void Main(string[] args)
{
Deleg del = new Deleg(DelegatskaKlasa.Funk1);
//ovdje stvaramo delegat del
//koji pokazuje na prvu funkciju
del(5);
del += new Deleg(DelegatskaKlasa.Funk2);
//ovdje samo dodajemo na drugu funkciju
Console.WriteLine("-----------------------------------------");
del(16);
//da bismo pristupili trećoj funkciji moramo stvoriti
//(instancu)
//objekt o preko kojeg pristupamo trećoj metodi.
DelegatskaKlasa o =
new DelegatskaKlasa(10);
//probajte bez argumenta jer imamo dva konstruktora
Deleg del2 = new Deleg(o.Funk3);
Console.WriteLine("----------------------------------------");
del += del2;
del(23);
Console.WriteLine("---------------------------------------");
del -= new Deleg(DelegatskaKlasa.Funk1);
del(2345);
}
}
}
Da bi razumjeli ovaj kod morate znati razliku između static i instance pristupa metodi .
Onaj tko ovo razumije tad može i proučiti kod.Ovo svakako nije za početnike već za one koji
su već malo napredovali u programiranju. Za C++ programere ima velike sličnosti s
pokazivačima na funkcije .
Delegati se mogu operatorima + , - dodavati i oduzimati.Uglavnom morate poštivati povratni
tip i argumente .
Računa o uklanjanju delegata vodi "garbage collection" automatizmom čiščenja memorije.
Delegate u C# -u koristimo za kreiranje Event-a .Znači delegati mogu biti usmjereni na više
metoda .Koja metoda se poziva preko delegata se odlučuje u toku izvođenja programa.
Naravno ,u ovom jednostavnom primjeru(ogledni primjer) mi smo sami odlučili koja metoda se
poziva ,ali se mogu staviti uvjeti da se ispune u toku izvođenja i ako je uvjet ispunjen
delegat se usmjerava na jednu metodu ,ako nije ispunjen ,usmjerava se na drugu metodu .
Ovdje se radi o "konzolnom" programiranju ,delegati imaju veće značenje u Win.Formama gdje
zajedno s Event-ima čine važan dio programiranja.
EVENT
Da biste recimo "bolje" ili lakše razumjeli "event-handler" objasniti ću samo zasad događaj u GUI-u(oblik koji se nalazi u Windows programiranju-recimo to tako ) radi jednostavnosti i standardnog event-a koji je sve prisutan u Windows programiranju.Koristi se dakle već definirani "defaultni" delegat ovog oblika :
public delegate EventHandler(object sender,EventArgs e);
Sad se sjetite da metoda koja se poziva preko ovog delegata mora imati iste parametre kao i delegat ,dakle :
object sender -objekt koji šalje zahtjev
EventArgs e - sadrži informacije o događaju
Sad možemo deklarirati delegat i event koji ćemo koristiti u klasi :
public delegate void SretanRodjendanDelegat(object sender ,EventArgs e);
public event SretanRodjendanDelegat EventSretanRodjendan; //primjetite da deklaracija event-a završava samo s točka,zarez!!
To sve zajedno je deklaracija događaja,ostaje nam samo sad napraviti klasu i implementirati događaj koji smo gore napisali.Događaj koji će se izvršiti pri unosu datuma koji se odnosi na dan našeg rođenja a na sve ostale datume nema tog događanja nego ispis pozdrava.
Deklaracija event-a je slična deklaraciji delegata ,ovdje imamo ključnu riječ event ,prije toga modifikator pristupa ,zatim ime delegata u našem događaju i na kraju ime koje dajemo našem event-u kojeg ćemo koristiti pri "podizanju događaja"!
Ovo je vrlo pojednostavljen primjer ,čak i objašnjenja za događaj ali se može lijepo vidjeti kako implementirati event ,napisati metodu za delegat preko kojeg se i omogućuje događaj.
Sve u svemu vrlo jednostavno i ogoljeno objašnjenje bez previše filozofiranja uključuje delegat koji poziva metodu a sve preko event-a koji je u jednom trenutku zatražen.
Možda je ovo sve prejednostavno ali mislim da se bit kako i zašto koristimo delegate i event-a lijepo vidi.
Jednostavna klasa za implementaciju događaja :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EventRodjendan
{
class Unos
{
//deklaracija događaja
public delegate void SretanRodjendanDelegat(object sender, EventArgs e);
public event SretanRodjendanDelegat EventSretanRodjendan;
//ovo je standardni oblik deklariranja Event-a ,dakle navođenje delegata
// i davanje imena našem event-u
private string ime;
private string prezime;
private DateTime datum;
public DateTime Datum
{
get { return datum; }
//ovdje "podižemo događaj"
set {
datum = value;
if (datum.ToString("dd MM") == DateTime.Now.ToString("dd MM"))
{
if (EventSretanRodjendan != null)
{
EventSretanRodjendan(this, new EventArgs());
}
}
}
}
public string Prezime
{
get { return prezime; }
set { prezime = value; }
}
public string Ime
{
get { return ime; }
set { ime = value; }
}
public string IspisImePrezime()//ovu metodu možemo i preklopiti s metodom ToString()
{
return this.Ime + " " + Prezime;
}
}
}
Main dio u kojem iniciramo događaj :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EventRodjendan
{
class Program
{
static void Main(string[] args)
{
Unos slavljenik = new Unos();
Console.WriteLine("Upišite ime : ");
slavljenik.Ime = Console.ReadLine();
Console.WriteLine("Upišite prezime : ");
slavljenik.Prezime = Console.ReadLine();
Console.WriteLine("Upišite datum : ");
slavljenik.EventSretanRodjendan +=
new Unos.SretanRodjendanDelegat(Slavljenik);//ovdje implementiramo događaj
try
{
slavljenik.Datum = DateTime.Parse(Console.ReadLine());
}
catch (Exception ex)
{
Console.WriteLine("Greška pri unosu ->{0}", ex.Message);
}
slavljenik.EventSretanRodjendan -=
new Unos.SretanRodjendanDelegat(Slavljenik);
Console.WriteLine();//ispisuje se samo pozdrav ako ne slavite
//ako slavite ->sve se ispisuje
Console.WriteLine("Pozdrav , {0}", slavljenik.IspisImePrezime());
}
//ovo je metoda koja je u sastavu delegata koja se poziva
//na temelju event-a
static void Slavljenik(object sender, EventArgs e)
{
Console.WriteLine("Sretan rođendan Vama prije pozdrava{0}",
((Unos)sender).IspisImePrezime());
}
}
}
Ovo je jednostavno objašnjenje kako se implementira događaj ,na koji ga način izazivamo.
Pretpostavljajući da znate nešto o klasama,objektima ,statičkim metodama,instancama i objektima a također i o hvatanju izuzetaka koje ovom prilikom nisam niti objasnio nadajući se da niste početnici.Ovo nije proučavanješto se dešava ispod "haube" o Event-ima i delegatima ,ovo su primjeri na kojima možete razumjeti "delegate i evente" ,čemu služe ,kako se deklariraju i izvode na prejednostavan način u konzolnom programiranju.To je zasad sve od mene.