16
Objektno orijentisano programiranje 2 Interfejsi

06 Interfejsi - Java

Embed Size (px)

DESCRIPTION

interfejsi, java

Citation preview

  • 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