Objektno orijentisano programiranje 2. Tipovi podataka u C#

Like dokumenter
Strukture. Strukturirani (složeni) tip podataka koji definiše korisnik. Razlike u odnosu na niz

Zadatak 1 strukture (C110) P2: Jedanaesta nedelja Strukture i liste. Strukture na jeziku C (2) Strukture na jeziku C (1)

Programiranje 1 grupno spremanje (zadaci) datoteke

Složeni tipovi podataka

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Izmena i dopuna konkursne dokumentacije

INF1010. Grensesnittet Comparable<T>

Uvod u Veb i Internet tehnologije HTML

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

PROJEKTOVANJE SOFTVERA

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

MINIMARK stampac za industrijsko obelezavanje

INF1010, 15. januar time. Parametriserte klasser (generiske klasser) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

1. DHB-E 18/21/24 Sli art ELEKTRONIČKI PROTOČNI GRIJAČ VODE

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

Del 3: Evaluere uttrykk

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

Del 1 En oversikt over C-programmering

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

IN1010 våren januar. Objektorientering i Java

IN2030. Oppgave 1. Løsningsforslag. Uke (Disse filene finnes også i mappen ~inf2100/e/e2/.)

INF1010, 21. januar Klasser med parametre = Parametriserte klasser = Generiske klasser

UNIVERSITETET I OSLO

LO191D/LC191D Videregående programmering

Generiske mekanismer i statisk typede programmeringsspråk

Gjennomgang prøveeksamen oppgave 1, 2, 4, 5, 7

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Repitisjonskurs. Arv, Subklasser og Grensesnitt

ALUMINIJSKE VODILICE ZA ODJELJIVANJE PROSTORA

Kako dostaviti logo. USBnet. Powered by

Dagens tema: Sjekking

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Eksamensrelevant repetisjonsstoff. Deklarasjoner og variabeltyper. Konstanter

INF1000 : Forelesning 4

Object interaction. Innhold. Abstraksjon Grunnleggende programmering i Java Monica Strand 3. september 2007.

Eivind Gard Lund. 24. Mars 2009 Foilene bygger på 2009 utgaven av Andreas Svendsen

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

En klasse er noe - en metode gjør noe (! / # <= (! * +!! ",-' %. "- -/ %.!#) )! " 0'%! * *$! "1-)) '' % '. 22!'( 7/ /! * 2 2! "*"% 8"%% 9 - -!

1 REALNE FUNKCIJE REALNE VARIJABLE

2 Om statiske variable/konstanter og statiske metoder.

Kapittel 9: Sortering og søking Kort versjon

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

INF 1000 høsten 2011 Uke september

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

Leksjon 6. Objekt. Evt. importsetninger. public class Klasse { Konstruktør. Objektmetoder. Innkapsling (private): set-og get-metoder

INF1000 undervisningen INF 1000 høsten 2011 Uke september

INF1010. Stein Michael Storleer (michael) Lenkelister

Kort repetisjon av doble (nestede) løkker Mer om 1D-arrayer Introduksjon til 2D-arrayer Metoder

INF5110. Oblig 2 presentasjon

INF1010 våren januar. Objektorientering i Java

INF Notater. Veronika Heimsbakk 10. juni 2012

OPPGAVE 5b og 8b Java Kode

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

EKSAMEN I FAG TDT MMI Lørdag 11. august 2012 Tid: kl

import java.util.arraylist;

INF våren 2017

HØGSKOLEN I SØR-TRØNDELAG

/* Adresu promenjive x zapamticemo u novoj promeljivoj. Nova promenljiva je tipa pokazivaca na int (int*) */ int* px;

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF Oblig 2 semantikksjekk og kodegenerering

Løsningsforslag til eksamen i INF1000 våren 2006

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

INF1000: Forelesning 7

"behrozm" Oppsummering - programskisse for traversering av en graf (dybde først) Forelesning i INF februar 2009

Lenkelister. Lister og køer. Kopi av utvalgte sider fra forelesningen.

INF1010 Binære søketrær ++

INF1010. grensesni-et Comparable<T> grensesni-et Iterable<T> rekursjon

Eksamen FSP5822/PSP5514 Bosnisk nivå II Elevar og privatistar / Elever og privatister. Nynorsk/Bokmål

2 Om statiske variable/konstanter og statiske metoder.

INF1000: noen avsluttende ord

Forelesning inf Java 5

Sensur-veiledning INF1000 h 2013 (fasit) am - 6. des. 2013

Forelesning inf Java 5

IN våren 2019 Onsdag 16. januar

IN våren 2018 Tirsdag 16. januar

INF1010 Rekursive metoder, binære søketrær. Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre

Seminaroppgaver IN1010, uke 2

Nybegynnerkurs i C. Øyvind Grønnesby. 14. oktober Introduksjon Typer Operatorer Kontrollstrukturer Pekere Makroer Lenker

INF1000: Forelesning 7. Konstruktører Static

Primena računara u fizičkoj hemiji. Profesor: Miloš Mojović Asistent: Aleksandar Ignjatović

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

DO ŽIV LJA JI HAK L BE RI JA FI NA

INF2100. Oppgaver 23. og 24. september 2010

for (int i=0; i<3; i++) { for (int j=0; j<5; j++) { System.out.print(i*j); System.out.println();

INF1010 Eksamenstips. Løsningsforslag prøveeksamen del 1.

JAVA Oppsummering for IS-102. Even Åby Larsen

Beskrivelse av programmeringsspråket Compila15 INF Kompilatorteknikk Våren 2015

GJØVIK INGENIØRHØGSKOLE

INF 1000 (uke 2) Variabler, tilordninger og uttrykk

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF2100. Oppgaver 9. oktober 2012 C 100 X 10

Eksamensoppgave i TDT4100 Objektorientert programmering med Java

UNIVERSITETET I OSLO

Løsningsforslag for eksamensoppgave, våren 2004

Transkript:

Objektno orijentisano programiranje 2

Klasifikacija tipova Osnovna podela na: vrednosne (value) tipove ukazane (reference) tipove Vrednosni tipovi: jednostavni tipovi (kao što su npr. byte, int, long, float, double) nabrajanja strukture Ukazani tipovi: klase interfejsi nizovi delegati Svi tipovi (uključujući jednostavne kao što je int) su podtipovi System.Object 2

Vrednosni i ukazani tipovi Razlike između vrednosnih i ukazanih tipova: alokacija memorije: vrednosni tipovi na steku, odnosno u okviru objekta, ako su članovi ukazanih tipova na hipu ukazani tipovi na hipu sadržaj: vrednosni tipovi podatak ukazani tipovi pokazivač (referenca) na podatak uništenje: vrednosni tipovi odmah pošto se napusti oblast definisanosti ukazani tipovi sakupljač đubreta Most između vrednosnih i ukazanih tipova mehanizam pakovanja (boxing) i raspakivanja (unboxing) efekat sličan korišćenju klasa-omotača (npr. Integer) na Javi 3

Pakovanje (boxing) 4 Pakovanje je mehanizam koji od vrednosnog podatka pravi ukazani objekat Mehanizam: pravi se primerak objekta na hipu u koji se kopira vrednosni podatak Primer pakovanje int promenljive: int i=10; object o=i; System.Console.WriteLine("i="+i+", o="+o); Primer pakovanje long literala: object longobj = 1000L; Strukture se mogu konvertovati u tipove interfejsa koje implementiraju Primer pakovanje struct podatka S koji implementira interfejs I: S s=new S(); I i=s; Implicitno pakovanje: prilikom dodele vrednosti ili inicijalizacije (kao u gornjim primerima) prilikom prosleđivanja vrednosnog argumenta gde se očekuje ukazani objekat prilikom pozivanja metoda strukture

Raspakivanje (unboxing) 5 Obrnut proces od pakovanja Od objekta koji sadrži prethodno spakovanu vrednost se pravi podatak vrednosnog tipa Nije moguće raspakivanje bilo kog objekta (onog koji ne sadrži spakovanu vrednost) Primer pakovanje i raspakivanje int promenljive: int i=10; object o=i; int ii=(int)o; System.Console.WriteLine("i="+i+", o="+o+", ii="+ii); Neophodna je eksplicitna konverzija (cast) Izvršni sistem proverava tip konverzije mora da odgovara tipu spakovane vrednosti ako se ne koristi odgovarajuća konverzija izuzetak System.InvalidCastException Ako su performanse bitne treba izbegavati pakovanje/raspakivanje, jer troši vreme

Vrednosni tipovi Vrednosni tipovi na C# su strukture i nabrajanja Java nije imala ni strukture ni nabrajanja u Javi 1.5 su uvedeni tipovi nabrajanja Svi ugrađeni vrednosni tipovi u C# su strukture čak su jednostavni tipovi: int,... strukture bitna razlika u odnosu na Javu koja poseduje primitivne tipove (int,...) ali poseduje i odgovarajuće klase omotača (Integer,...) važno za realizaciju mehanizma pakovanja ugrađenih tipova Vrednosni tipovi su izvedeni iz System.ValueType koji je izveden iz System.Object 6

Strukture Slične klasama, ali su vrednosni, a ne ukazani tipovi Razlike u odnosu na klase: primerci se alociraju na steku, ili u okviru objekta na hipu, ako je struktura član memorija alocirana primerku strukture sadrži članove podatke, ne referencu zauzeta memorija se oslobađa odmah nakon napuštanja dosega, mimo sakupljača đubreta Definicija: [<atributi>][<modifikatori>] struct <identifikator> [:<interfejsi>]{<metodi i polja>} Nasleđivanje: iz njih se ne može izvoditi niti se one izvode (osim implicitno iz System.ValueType) mogu da implementiraju interfejse 7

Jednostavni tipovi Implementirani kao strukture (vrednosni tipovi) Jezik definiše ključne reči (int,...) kao sinonime za ugrađene jednostavne tipove Na primer: int je sinonim za System.Int32, float je sinonim za System.Single Odgovaraju primitivnim tipovima na Javi, ali je skup bogatiji postoje kardinalni (neoznačeni, unsigned) celobrojni tipovi tip decimal za preciznu aritmetiku u fiksnom zarezu (128 bita, 28 značajnih cifara) Na raspolaganju su: bool, sbyte, byte, short, ushort, int, uint, long, ulong, float, double, decimal, char 8

Nabrajanja 9 Tip definiše skup imenovanih celobrojnih konstanti Definicija: [<atributi>][<modifikatori>]enum<ident>[:<osnova>]{<telo>} Osnova može biti bilo koji celobrojni tip, podrazumevano je int Telo sadrži listu imena članova sa opcionim vrednostima Imena članova moraju biti jedinstvena, ali više članova može imati istu vrednost Podrazumevano, prvi član ima vrednost 0, a naredni članovi veće vrednosti redom Primer boje karata u preferansu: public enum BojeKarata:byte {Pik=2,Karo,Herc,Tref,Min=Pik,Max=Tref} Korišćenje: BojeKarata.Herc Celobrojna konstanta 0 je implicitno konvertibilna u bilo koji tip nabrajanja može se uvek proslediti kao argument tamo gde se očekuje podatak tipa nabrajanja Nasleđivanje: iz njih se ne može izvoditi niti se oni izvode izvedeni su implicitno iz System.Enum koja je izvedena iz System.ValueType

Ukazani tipovi 10 Podaci ukazanih tipova (reference types): stvaraju se na hipu uklanjaju se automatski od strane sakupljača đubreta U ukazane tipove spadaju: klase interfejsi nizovi delegati Klase, interfejsi i nizovi su poznati koncepti, na jeziku C# je slična podrška kao u Javi Delegati novi koncept bezbedno pozivanje metoda po referenci

Klase Različita sintaksa za izvođenje i implementaciju interfejsa nego u Javi koristi se, kao u jeziku C++, simbol : Prvo se eventualno navodi bazna klasa (može biti samo jedna), pa interfejsi Primer: public class IzvedenaKlasa:OsnovnaKlasa, Interfejs1, Interfejs2 {...} Na C# nema lokalnih ni anonimnih klasa Apstraktna klasa mora da naznači da je metod interfejsa koji nije realizovan apstraktan Podrazumevani konstruktor je uvek javni, osim za apstraktnu klasu, gde je zaštićen Postoji metod Object.Finalize() koji se ne poziva i ne redefiniše Metod Object.Finalize() se implicitno poziva iz destruktora ista sintaksa destruktora kao u C++ 11

Promenljive i parametri metoda Kao i Java, C# je strogo tipiziran jezik zahteva se da svaka promenljiva ima tip Postoji 7 vrsta promenljivih, od kojih su 3 vrste parametara: statičko polje (promenljiva klase) nestatičko polje (promenljiva objekta) element niza lokalna promenljiva parametar po vrednosti po referenci izlazni Podrazumevano parametri se prenose po vrednosti, isto kao u Javi pravi se kopija stvarnog argumenta ako se kopija menja to ne utiče na stvarni argument 12

Parametri ref i out Za prenos po referenci se koristi ključna reč ref, a za izlazni out Ove ključne reči se koriste i u definiciji metoda i na mestu poziva Prenos parametara po referenci omogućava bočne efekte metoda nad njima: ne pravi se kopija stvarnog argumenta već se izmene vrše nad njim Izlazni parametri ne moraju da budu inicijalizovani pre prosleđivanja metodu Ako se izlaznom parametru ne pridruži vrednost u metodu greška Primer: public class C{ public static void M(out int x){x=5;} public static void Main(){int x; C.M(out x);} } 13

Delegati 14 Bezbedan mehanizam za prosleđivanje reference na metod(e) kao parametra prosleđivanje pokazivača na metod i poziv metoda preko pokazivača ne bi bili bezbedni Koriste se primarno za obradu događaja i povratne pozive (callback) Primerci (objekti, instance) delegata sadrže reference na jedan ili više metoda formira se lista poziva (invocation list) metodi se stavljaju na listu poziva u konstruktoru delegata ili operatorima +, += uklanjaju sa liste poziva operatorima -, -= metodi sa liste pozivaju se preko delegata Definicija: [<atributi>][<modifikatori>]delegate<tip><identifikator> (<parametri>); Tip i parametri definišu povratni tip i potpis za metode sa liste poziva Delegati se mogu definisati kao tip najvišeg nivoa ili kao ugnežđeni u klasu/strukturu

Primerci delegata Primerci delegata se prave navođenjem imena metoda koji odgovara deklaraciji bilo koji (statički ili nestatički) metod koji odgovara deklaraciji može da se koristi Dodela jednog delegata drugom kopira listu poziva iz izvorišnog u odredišni Operatori + i += rezultuju u kombinovanim listama poziva reference na metode se ređaju redosledom dodavanja dodavanje jednog metoda na listu dva puta rezultuje u dupliranim referencama na metod Operatori i -= rezultuju u uklanjanju referenci na metode sa liste poziva delegata u slučaju višestrukih referenci na metod uklanja se poslednja referenca sa liste pokušaj uklanjanja reference na metod koji nije na listi ne izaziva grešku Delegat se poziva po imenu sa parametrima kao da je metod koji odgovara deklaraciji poziv izaziva izvršavanje svih metoda sa liste poziva redom, prosleđujući im parametre ako je parametar objekat ili ref parametar, promene iz jednog metoda vidi naredni metod povratna vrednost je ona koju vrati poslednji metod sa liste 15

Primer delegata //neka su: int MetodX(int i, string s){} gde je X {1,2,3} //MetodX je statički ili metod objekta klase public delegate int MojDelegat(int i, string s);... MojDelegat d1 = new MojDelegat(Metod1); MojDelegat d2 = new MojDelegat(Metod2); MojDelegat d3 = d1+d2; //lista: Metod1, Metod2 d3 += new MojDelegat(Metod3); //lista: Metod1, Metod2, Metod3 d3 -= d1; //lista: Metod2, Metod3 d3 -= new MojDelegat(Metod3); //lista: Metod2 int i = d3(5, "Proba"); 16

Članovi 17 Članovi su elementi programa koji se sadrže u: prostorima imena, klasama, strukturama i interfejsima Dele se u tri kategorije: funkcionalni (izvršni kod), podaci (konstantni i promenljivi) i tipovi (ugnežđene definicije) Funkcionalni članovi: statički i konstruktori primeraka, destruktori, metodi, operatori, svojstva, indekseri, događaji Članovi podaci: konstante, polja Tipovi: klase, interfejsi, strukture, nabrajanja, delegati Statički članovi nisu pristupačni preko referenci na objekte, već samo preko odgovarajućih tipova

Prava pristupa članovima Modifikatori za određivanje prava pristupa članu: public javni pristup bez ograničenja protected zaštićeni pristup, samo članovi klase i članovi izvedenih klasa private privatni pristup, samo članovi klase internal interni pristup, samo elementi koji su u okviru istog sklopa protected internal zaštićen interni pristup, unija zaštićenog i internog pristupa Ne postoji pravo pristupa vezano za prostor imena pandan paketskom pravu pristupa u Javi Podrazumevano pravo pristupa članova klasa i struktura je privatno za strukture različito nego u C++ (u C++ je bilo javno) Dozvoljeni modifikatori za određivanje prava pristupa članu prostora imena: public internal Podrazumevano pravo pristupa članova prostora imena je interno (internal) 18

Nasleđivanje članova U Javi : metode se implicitno definišu kao virtuelne metod u izvedenoj klasi sa istim potpisom i povratnim tipom redefniše nasleđeni metod poziv metoda objekta pokreće onaj koji odgovara najbližoj redefiniciji u hijerarhiji klasa Problemi pri izmeni bazne klase (pisanju nove verzije bazne klase): ako se u baznoj klasi napiše metod koji potpuno odgovara nekom metodu izvedene klase pozivaće se metod izvedene klase, iako programer to neće očekivati ako se u baznoj klasi napiše metod sa istim potpisom, ali različitim povratnim tipom izvedena klasa više neće moći da se prevede opisani problemi su verovatni ako osnovnu i izvedenu klasu ne proizvodi ista firma C# prevazilazi probleme nasleđivanja eksplicitnim redefinsanjem ili sakrivanjem 19

Redefinisanje i sakrivanje nasleđa Redefinisanje ima istu prirodu kao u Javi, ali nije podrazumevano Član bazne klase koji treba da bude redefinisan, deklariše se kao virtuelni (virtual) Član izvedene klase koji definiše novu implementaciju nasleđenogčlana deklariše se kao redefinisan (override) bez modifikatora override, član u izvedenoj klasi skriva član u baznoj (uz upozorenje) ako se stavi modifikator override za član koji u baznoj nije virtual, dobija se greška Za eksplicitno sakrivanje člana bazne klase, u izvedenoj se koristi modifikator new na taj način se izbegava upozorenje prevodioca Sakrivanje raskida polimorfno ponašanje virtuelnih članova Kombinacija virtual i new: nova početna tačka specijalizacije polimorfno ponašanje sa članovima potomaka, ali ne i predaka Za dohvatanje nasleđa iz bazne klase: ključna reč base (odgovara super u Javi) 20

Zapečaćeni članovi U Javi se koristi modifikator final da označi da se metod ne može redefinisati U C# se koristi kombinacija modifikatora override i sealed primenljivo samo na nasleđene virtuelne članove razlika u odnosu na Javu na C# se ne može koristiti odmah u osnovnoj klasi nije ni potrebno, jer metodi u baznoj klasi podrazumevano nisu virtuelni Ako se klasa označi kao sealed, iz nje se ne može izvoditi 21

Svojstva (1) Svojstvo (property) omogućava direktan pristup stanju objekta: notacijski kao da se pristupa polju pristup se (u pozadini) ostvaruje preko metoda Definicija: [<atributi>][<modifikatori>]<tip><identifikator> [{<pristupnici>}] Tip može biti bilo koji vrednosni ili ukazani tip: specificira tip podataka koji se dodeljuje svojstvu, odnosno koje svojstvo vraća Pristupnici (accessors) - pristupne definicije: definišu set i get funkcije za pristup (promenu/čitanje) stanju svojstva mogu sadržati proizvoljan kod Automatski definisana promenljiva value sadrži vrednost koja se dodeljuje svojstvu 22

Svojstva (2) 23 Primer: public class Osoba{ private int godine; public int Starost{get {return godine;} set {godine=value;}} } Osoba o=new Osoba(); o.starost=21; int g=o.starost; o.starost++; o.starost+=5; Ako svojstvo ima samo get ili set, reč je o svojstvu koje se samo čita ili samo menja Ako se želi upotreba operatora ++, --, ili kombinovanih dodela (npr. +=) potrebno je realizovati oba pristupnika (set i get) Interfejsi mogu da sadrže deklaraciju svojstva, bez tela pristupnika get i set Primer: public interface Iosoba{ int Starost{get;set;} string MaticniBroj{get;} }

Indekseri (1) Indekseri omogućavaju korišćenje sintakse indeksiranja za klase/strukture koje ih sadrže Pogodno je za klase koje sadrže kolekcije podataka, za pristup elementima kolekcije Slični svojstvima u smislu da pružaju način pristupa stanju objekta preko funkcija Nije potreban identifikator indeksera (kao što je potreban za svojstvo) jer se elementu kolekcije pristupa preko imena objekta kolekcije u definiciji se koristi ključna reč this umesto identifikatora indeksera Definicija: [<atributi>][<modifikatori>]<tip> this [<parametri>] {<pristupnici>} 24

Indekseri (2) Mora postojati bar jedan parametar (indeks), moguće više Indekseri sa više parametara odgovaraju multidimenzionalnim nizovima Tip parametra može biti proizvoljan vrednosni ili ukazani tip Primer: public string this [int indeks1, byte indeks 2, string indeks3]{...} Moguće je definisati i više indeksera u klasi/strukturi Da bi se razlikovali moraju imati različite tipove parametara Kao i svojstva, indekseri mogu da imaju samo set ili get pristupnike moraju imati oba pristupnika ako se žele koristiti ++, --, +=,... Mogu biti članovi interfejsa (set i get bez tela) tada se mogu koristiti samo preko referenci na interfejse 25

Primeri indeksera public class Naj10{ private string[] najbolji=new string[10]; public string this[int i]{ get{ if(i>0&&i<11){ return najbolji[i-1];} else {return null;}} set{ if(i>0&&i<11){ najbolji[i-1]=value; }} } } public static void Main(){ Naj10 studenti=new Naj10(); studenti[1]= "Pera"; studenti[2]= "Mika"; studenti[3]= "Laza";... } public interface I{string this [int i]{get;set;}} public class C:I{string I.this [int i]{get{...} set{...}}} C a=new C(); string s1=a[1]; // pogresno C b=new C(); string s2=((i)b)[1]; // ispravno I i=new C(); string s3=i[3]; // ispravno 26

Događaji Formalizacija opšteg mehanizma za obaveštavanje o događajima skup registrovanih slušalaca se obaveštava kada se desi događaj Mehanizam koristi delegate za sistem obaveštavanja slušaoci registruju odgovarajućeg delegata kod izvora događaja izvor događaja izvršava metode svih registrovanih delegata kada se događaj desi Definicija: [<atributi>][<modifikatori>]event<tip><identifikator> [{<pristupnici>}] Tip događaja (<tip>) je tip već definisanog delegata Pristupnici omogućavaju posebnu funkcionalnost dodavanja i uklanjanja slušalaca ako nedostaju, prevodilac obezbeđuje podrazumevanu funkcionalnost Događaj se može izazvati jedino unutar tipa u kojem se definiše čak i ako je protected, ne može se izazvati iz izvedene klase Događaj se izaziva pozivom po imenu sa stvarnim argumentima koji odgovaraju tipu Za registrovanje/deregistrovanje slušalaca se koriste operatori += i -= 27

Primer obrade događaja (1) Obrada događaja promene temperature više slušalaca se registruje kod više izvora promene temperature using System; public delegate void ObradaDogadjajaPromeneT(string izvor, int t); public class IzvorDogadjajaT{ private string ime; private int t=0; public event ObradaDogadjajaPromeneT dogadjajpromenat; public IzvorDogadjajaT(string imeizvora){ime=imeizvora;} public void Promena(int novat){ t=novat; if (dogadjajpromenat!= null) dogadjajpromenat(ime,t); } public void otkacislusaoce(){dogadjajpromenat=null;} } 28

Primer obrade događaja (2) 29 public class Slusalac{ private string ime; public Slusalac(string imeslusaoca, IzvorDogadjajaT[] izvori){ ime=imeslusaoca; foreach (IzvorDogadjajaT t in izvori) t.dogadjajpromenat+=new ObradaDogadjajaPromeneT(this.TPromenjena); } //this se podrazumeva public void TPromenjena(string izvor, int t){ Console.WriteLine(ime + ": t=" + t + "C na lokaciji " + izvor); } public static void Main(){ IzvorDogadjajaT d = new IzvorDogadjajaT("dvoriste"); IzvorDogadjajaT f = new IzvorDogadjajaT("frizider"); new Slusalac("Slusalac 1", new IzvorDogadjajaT[]{d,f}); new Slusalac("Slusalac 2", new IzvorDogadjajaT[]{d,f}); d.promena(35); f.promena(10); } }

Pristupnici događaja Funkcije koje se pozivaju kada se koriste += i -= za dodavanje/uklanjanje slušalaca U većini slučajeva podrazumevana funkcionalnost je dovoljna Ključna reč add za definisanje funkcionalnosti dodavanja slušalaca Ključna reč remove za definisanje funkcionalnosti uklanjanja slušalaca Jedini parametar unutar blokova add i remove: implicitni parametar value sadrži referencu na primerak delegata koji se dodaje/uklanja Primer: public event RutinaZaObradu Dogadjaj{ add { /* funkcionalnost za dodavanje slusaoca */ } remove { /* funkcionalnost za uklanjanje slusaoca */} } 30

Standardni delegat za obradu događaja.net standardizuje potpis delegata koji se koriste za obradu događaja Konkretna implementacija u System.EventHandler sa potpisom: public delegate void EventHandler(object izvor, EventArgs arg); Izvor je referenca na objekat koji izaziva događaj Klasa EventArgs nema specijalizovanu funkcionalnost, iz nje se izvode argumenti 31