Objektno orijentisano programiranje 2
Interfejsi
06.03.2012.Interfejsi2
Uvod
Interfejsi su nain da se deklarie tip obrazovan samo od apstraktnih metoda i konstanti
Osnovna slinost izmeu klasa i interfejsa: oboje definiu tipove
Osnovna razlika izmeu klasa i interfejsa: interfejs je stvar istog ugovora klasa je kombinacija ugovora i implementacije
Klasa moe da implementira metode interfejsa na nain koji odredi njen projektant
Java podrava jednostruko nasleivanje implementacije i viestruko nasleivanje interfejsa
06.03.2012.Interfejsi3
Primer
Definicija interfejsa sve klase koje treba da realizuju bafer treba da implementiraju interfejs IBafer:
interface IBafer{void isprazni();void stavi(Object o);Object uzmi();
} Implementiranje interfejsa
abstract class Bafer implements IBafer {protected int p=0;protected Object[] niz;public Bafer(int velicina){niz = new Object[velicina];}public void isprazni(){ p=0;
if(niz!=null)for(int i=0;i
06.03.2012.Interfejsi4
Metode i polja interfejsa Svaka klasa koja implementira interfejs mora:
da implementira sve njegove metode ili da bude deklarisana kao apstraktna
Metode interfejsa su uvek (implicitno) apstraktne i javne Metode interfejsa ne mogu biti statike Polja interfejsa su uvek statika i konana (static & final)
ona su nain da se definiu konstante koje se koriste pri pozivu metoda Primer:
interfejs koji ugovorom definie srednju temperaturu za razliita godinja doba:interface SezonskiTermometar{int PROLECE=0; int LETO=1; int JESEN=2; int ZIMA=3;float srednjaTemperatura(int doba);
} Imenovane konstante se mogu proslediti metodi
srednjaTemperatura(int doba)
06.03.2012.Interfejsi5
enum tip umesto konstanti
Problem sa imenovanim konstantama nisu bezbedne provera tipa ne pomae, jer se moe pojaviti vrednost van opsega na primer, kao stvarni argument metoda srednjaTemperatura(int)
nema bezbednog naina da se int ogranii na vrednosti 0-3, koje se oekuju Problem se moe prevazii pomou enum tipa (uvedenog u Java 5.0)
interface SezonskiTermometar{enum GodisnjeDoba{PROLECE, LETO, JESEN, ZIMA}float srednjaTemperatura(GodisnjeDoba doba);
} Tip enum je klasni tip pored konstanti moe imati konstruktore i metode Konstante enum tipa se ponaaju kao reference na objekte tog tipa Argumenti koji se navode uz konstantu su argumenti konstrukora Konstruktor se izvrava za konstantu prilikom uitavanja klase
06.03.2012.Interfejsi6
Proirivanje implementacije interfejsa// date implementacije ne vode racuna o prekoracenjuclass LIFObafer extends Bafer {
public LIFObafer(int velicina){super(velicina);}public void stavi(Object o) {niz[p++]=o;}public Object uzmi(){return niz[--p];}
}class FIFObafer extends Bafer {
private int k=0; // indeks poslednje stavljenogprivate int max;public FIFObafer(int velicina){super(velicina); max=velicina;}public void isprazni(){super.isprazni(); k=0;}public void stavi(Object o) {niz[k]=o; k=(k+1)%max;}public Object uzmi(){Object t=niz[p]; p=(p+1)%max; return t;}
}
06.03.2012.Interfejsi7
Korienje implementacije interfejsa Definicije interfejsa uvode nova imena tipova Referenca na objekat koji implementira interfejs se moe dodeliti referenci tipa tog interfejsa Primer:
class FIFO_LIFO {public static void test(IBafer b){
// public static void test(Bafer b){ // ekvivalentnofor (int i = 0; i
06.03.2012.Interfejsi8
Kada koristiti interfejse? Vane razlike izmeu interfejsa i apstraktnih klasa:
moe se implementirati vie interfejsa, a proiriti samo jedna apstraktna klasa
apstraktna klasa moe imati deliminu implementaciju, a interfejs ne
apstraktna klasa moe imati zatiene delove i statike metode,dok su interfejsi ogranieni na javne nestatike metode i konstante
Vane klase treba da budu implementacije interfejsa ovo pogotovo vai ako se oekuje da e te klase biti proirivane
06.03.2012.Interfejsi9
Jednostruko/viestruko nasleivanje Nasleivanje u OO programskim jezicima moe biti:
jednostruko klasa neposredno nasleuje samo jednu klasu viestruko klasa moe imati dve ili vie neposrednih roditeljskih klasa
Proirivanjem klasa nasleuje ugovor i implementaciju natklase Problem je nasleivanje implementacije u dijamant strukturi:
ako W uva stanje (polje f) ta e znaiti z.f (ako je: Z z;)? da li postoje dve kopije ili samo jedna?
Java dozvoljava samo jednostruko nasleivanje za klase da izbegne ovaj problem
XW
ZY
06.03.2012.Interfejsi10
Viestruko nasleivanje u Javi Spreavanje viestrukog nasleivanja
spreava i neke korisne dizajne Problemi viestrukog nasleivanja
potiu od viestrukog nasleivanja implementacije Java nudi nain da se nasledi samo ugovor Interfejsi omoguavaju viestruko nasleivanje u Javi Supertipovi neke klase su:
klase koje su proirene i interfejsi koji su implementirani
06.03.2012.Interfejsi11
Proirivanje interfejsa Interfejsi se mogu proirivati Jedan interfejs moe da proiruje vie drugih:
interface I extends BI1, BI2{double i_method();
} Sve metode i konstante baznih interfejsa su deo novog interfejsa Viestruko izvoenje kod klasa:
klasa koja proiruje neku klasu i implementira neki interfejs klasa koja implementira vie interfejsa
06.03.2012.Interfejsi12
Primeri
Primeri viestrukog nasleivanja u romboidnoj (dijamant) strukturi:interface W{}interface X extends W{}class Y implements W{}class Z extends Y implements X{}
interface W{}interface X extends W{}interface Y extends W{}class Z implements X,Y{}
XW
ZY
XW
ZY
06.03.2012.Interfejsi13
Relacija sa klasom Object Interfejsi nemaju neki jedinstveni koreni interfejs
(kao to klase imaju klasu Object) Reference na objekte klasa koje implementiraju neki interfejs
se mogu dodeliti referencama na tip Object Primer: ako je I interfejs
void a(I iRef){ Object obj = iRef; /*...*/} Izraz tipa nekog interfejsa se moe proslediti metodi
sa formalnim parametrom tipa Object Primer:
void b(Object o){ /*...*/ } /*...*/ I iRef; /*...*/ x.b(iRef);
06.03.2012.Interfejsi14
Konflikti imena metoda
ta se dogaa kada se metoda istog imena pojavljuje u vie implementiranih interfejsa?
metode imaju razliit broj ili tipove parametara:=> dve metode preklopljenih imena
metode imaju tano jednake potpise i povratne tipove => jedna metoda sa istim potpisom i povratnim tipom
metode se razlikuju jedino u povratnom tipu => ne mogu se implementirati oba interfejsa
metode se razlikuju samo u throws klauzuli=> jedna metoda koja zadovoljava obe throws klauzule
06.03.2012.Interfejsi15
Razliite throws klauzule
Metod moe da baca manje izuzetaka nego to je deklarisano u odgovarajuoj metodi nadtipa
Primer:interface X { void m() throws Greska; }interface Y { void m(); }class Z implements X,Y {
public void m() {/*...*/}}
Z implementira metod m() tako da ne baca izuzetke,to zadovoljava i X.m() i Y.m()(ua lista izuzetaka u odnosu na X.m())
06.03.2012.Interfejsi16
Konflikti imena konstanti
Moe se dogoditi da dva implementirana interfejsa sadre konstante istog imena
Za takve konstante treba koristiti imena sa kvalifikatorima Primer:
interfejsi PreferansSpil i RemiSpilsadre konstante VELICINA razliitih vrednosti
klasa MultiSpil implementira oba interfejsa u klasi MultiSpil moraju se koristiti imena
PreferansSpil.VELICINA, RemiSpil.VELICINA samo VELICINA je dvosmisleno