13 INTERFEJSI 1 definicija interfejs je poseban element
13 INTERFEJSI 1
definicija • interfejs je poseban element jave (nije klasa!), koji se koristi za spregu klijenta sa klasom • osobine: – nema nijednu operacionalizovanu metodu – (ako ih uopšte ima), polja se tretiraju kao public static final (modifikatori se ne pišu) – može biti public ili default – svi članovi su public (modifikator se ne piše) – ne može se instancirati (nema konstruktor) – može biti generički – omogućuje polimofnu zamenu 2
sintaksa • definiše se sa interface Naziv. Interfejsa { //polja (sva su public static final) //zaglavlja metoda (sve su public) } gde je modifikator ili public ili default (tj. prazan) 3
veza između interfejsa i klase • između interfejsa i klase uspostavlja se veza implementacije koja podseća na nasleđivanje (ali nije ista!) • sintaksa: Naziv. Klase implements Naziv. Interfejsa { ………………. . } • u klasi su implementirane sve metode iz interfejsa 4
UML interfejs <<interface>> Naziv. Interfejsa veza implementacije K 1 K 2 Kn klase 5
inkluzioni polimorfizam • za vezu implementacije važi inkluzioni polimorfizam i to u sve tri forme! <<interface>> Intr Klasa Intr in = new Klasa(); ili Intr in; in = new Klasa(); 6
• kada se izvrši polimorfno pridruživanje objekta interfejsu in, nad promenljivom in mogu se primeniti samo metode zadate u interfejsu i koristiti samo polja zadata u interfejsu, tj. • kroz interfejs "vidi se" samo onaj deo objekta koji je deklarisan u interfejsu 7
operator instanceof • operator instanceof primenljiv je i na interfejs Intr in; ob. K Klasa ob. K = new Klasa(); in in = ob. K; // in instanceof Intr je true // ob. K instanceof Intr je true // in instanceof Klasa je true // ob. K instanceof Klasa je true 8
opšti slučaj • data klasa nasleđuje tačno jednu klasu, a može implementirati više interfejsa K <<interface>> I 1 . . . . <<interface>> In A class A extends K implements I 1, . . . , In { ………………… } 9
primene interfejsa • neke karakteristične primene interfejsa: – – – višestruka realizacija iste klase nasleđivanje implementacije više pogleda na istu klasu realizacija tipa enumeracije filtriranje tipa argumenta 10
višestruka realizacija klase • kao što je poznato, većina klasa može se realizovati na više načina • na primer, red (queue) može se realizovati sekvencijalno ili spregnuto • korišćenjem zajedničkog interfejsa može se postići da se obe verzije koriste na isti način, što programeru u velikoj meri olakšava rad 11
public interface Queue<T> { T get(); void put(T el); T remove(); boolean is. Empty(); boolean is. Full(); <<interface>> Queue <T> +get(): T +put(T el) +remove(): T +is. Empty(): boolean +is. Full(): boolean } <T> Sequential. Queue <T> Linked. Queue 12
Queue<String> q; q = new Sequential. Queue<String>(); q = new Linked. Queue<String>(); u oba slučaja q se koristi način (preko metoda get, put, remove, is. Empty i is. Full), jer se samo te metode "vide" 13
nasleđivanje implementacije • mehanizam za preuzimanje sadržaja neke klase u datu uz istovremeno podešavanje interfejsa date klase • primer: spregnuto realizovan red može se napraviti od spregnute liste, uz promenu interfejsa reda da bi se eliminisao višak operacija iz liste • postoji i u C++ kao private nasleđivanje 14
primer: spregnuti red <<interface>> Queue +get(): T +put(T el) +remove(): T +is. Empty(): boolean +is. Full(): boolean <T> Sequential. Queue <T> java. util: : Linked. Queue <T> Linked. Queue 15
public class Linked. Queue<T> extends Linked. List<T> implements Queue<T> { public T get() { return is. Empty() ? null : get. First(); } public void put(T el) { add. Last(el); metode nasleđene iz Linked. List } public T remove() { return remove. First(); } //is. Empty() je vec implementirana u Linked. List! public boolean is. Full() { return false; } } 16
više pogleda na klasu • ako se složena klasa veže za više interfejsa, ona se može "videti" kroz njih na različite načine (slično biblioteci u C/C++) 17
<<interface>> Radio <<interface>> Sat Radio. Sat public interface Radio {metode radija} public interface Sat {metode sata} public class Radio. Sat { //ovde su implementirani i radio i sat! } 18
Radio rd = new Radio. Sat(); ponaša se kao radio Sat st = new Radio. Sat(); ponaša se kao sat Radio. Sat rds = new Radio. Sat(); ponaša se kao radio-sat • mehanizam podseća na višestruko nasleđivanje, ali to nije slučaj, jer nema preuzimanja sadržaja iz klasa Radio i Sat (u pitanju su samo interfejsi) 19
zamena za enumeraciju • mada postoji posebna komponenta jave zvana Enumeration, tip enumeracije nejjednostavnije se realizuje interfejsom, jer su sva polja public static final: public interface Boja { int CRVENA=0; int ZELENA=1; int PLAVA=2; } • korišćenje: Boja. CRVENA, Boja. ZELENA itd. 20
filtriranje tipa argumenta • kada metoda treba da prihvati kao argumente samo objekte koji garantuju određeno ponašanje, a klase kojima ti objekti pripadaju nisu vezane nasleđivanjem 21
<<interface>> J M K • metoda met može da primi kao argument samo objekat klase K ili M (ili neke njihove potklase): public tip met(J par) {. . . } • naredba može da se izvrši samo ako ob pripada klasama K ili M, odn. njihovim potklasama: if(ob instanceof J) naredba 22
višestruko nasleđivanje • Java nema višestruko nasleđivanje niti se ono može u celosti postići drugim sredstvima • neka klasa X treba višestruko da nasledi klase A i B A B X 23
• jedno rešenje je zameniti višestruko nasleđivanje kompozicijom, tj. u klasi X definisati jedno polje tipa A i još jedno polje tipa B public class X { A a; B b; // eventualno formiranje interfejsa klase } • time je postignuta ušteda na vremenu izrade klase X, ali • polimorfizam ne važi, tj. ob. X instanceof A i ob. X instanceof B daje false. 24
• drugo rešenje je napraviti interfejse A i B i implementirati ih u klasi X. Polimorfizam sada važi, ali se kompletna realizacija mora izvesti u klasi X (nema preuzimanja koda) • ovaj slučaj sreli smo u primeru Radio. Sat 25
- Slides: 25