Vezbe 07 - Abstraktne, Final Klase, Interfejsi

Embed Size (px)

Citation preview

  • 8/16/2019 Vezbe 07 - Abstraktne, Final Klase, Interfejsi

    1/11

    VEŽBE 07

    Abstraktne klase i njene članice

    • Ključna reč abstract  •

    Klasa postaje apstraktna kada se ispred njene definicije stavi reč abstract .• Abstraktna klasa se ne može instancirati.• Svrha apstraktne klase je da omogući prostu definiciju osnovne klase koju brojne

    izvedene klase mogu da dele .• Samo apstraktne klase mogu da definišu apstraktne članice.•  Nii nivo apstrakcije u odnosu na interfejs.• !eklaracija apstraktne klase"

     [modifikator_pristupa] abstract class nai!_klase " telo#klase #

    public abstract class A

      {  // Članice klase.  }

    A$S%&AK%N' ('%)!'

    • Abstraktne metode nemaju implementaciju pa se definicija završava sa *;+.• ,zvedene klase -klase koje nasleuju apstraktnu klasu/ moraju da

    implementiraju sve apstraktne metode.•

    0 izvedenoj klasi se apstraktna metoda redefiniše korišćenjem ključne rečioverride.• 0 apstraktnoj klasi mogu postojati implementirane članice klase -metode1

    svojstva1 polja.../.• !eklaracija apstraktne metode"

    modifikator abstract tip_povratne_vrednosti naziv_metode (lista_parametara);

    public abstract class A{  public abstract void DoWork(int i);}

    public class B extends A {

    @Override

      public void DoWork(int i){// implementacia}}

    2

  • 8/16/2019 Vezbe 07 - Abstraktne, Final Klase, Interfejsi

    2/11

    • Kada apstraktna klasa nasleuje virtuelnu metodu iz bazne klase1 apstraktnaklasa moe da je redefiniše sa apstraktnom metodom.

    public class D

      {  public void DoWork(int i)  {  // !ri"inalna implementacia.  }  }

    public abstract  class E extends D  {   public abstract  override void DoWork( int  i);  }

    public class # extends $  {// %adi se rede&nisane apstraktne metode u i'vedeno klasi pa se koristiklucna rec override. 

    @Override

      public void DoWork(int i)  {  // ova implementacia.  }  }

    $A%&'E$A( • Ako je metod deklarisan kao apstraktni1 on je i dalje !irtuelan a s!aku klasu koja

    nasle)uje tu klasu.

    • Klasa koja nasleuje apstraktni metod ne moe da pristupi originalnoj implementaciji

    metoda3 u prethodnom primeru DoWork  klase F  ne moe da poziva DoWork klase D. 

    •  Na ovaj način apstraktna klasa moe da natera izvedene klase da omoguće novu

    implementaciju za virtuelni metod.

    4

  • 8/16/2019 Vezbe 07 - Abstraktne, Final Klase, Interfejsi

    3/11

    5,NA6 K6AS' , N7'N' 86AN,9'

    • Ključna reč final .• )nemogućava da klasa bude nasleena od strane drugih klasa ili neke članice klase koje

    su prethodno bile označene kao virtuelne.

    [modifikator_pristupa] final class nai!_klase "članice_klase#

    public fnal class D{  // Članice klase.}

    • )vakva klasa se ne može naslediti1 pa zato i ne može da bude apstraktna.• 8lanovi klase" metode1 polja1 svojstva članovi ili dogaaji u izvedenoj klasi koja

    redefiniše virtuelne članove osnovne klase1 moe da proglasi te članove kao final . %onegira virtuelni aspekt članova za bilo koju dalje izvedenu klasu.

    modifikator final  tip_po!ratne_!rednosti nai!_metode*+",#

    public class D extends {@Override

      public fnal void DoWork() {... }}

    ::;rimer 2 < sakrivanje članice klase u izvedenim klasama"class * {  protected void #() { +,stem.out.println(-*.#-); }  protected void #() { +,stem.out.println(-*.#-); }}class   extends * {// 0ostavlanem klu1ne re1i &nal onemo"u2ava se dale nasle3ivane// i rede&nisane metode # u i'vedenim klasama

    @Override protected fnal void #() { +,stem.out.println(-.#-); }  @Override protected void #() { +,stem.out.println(-.#-); }}class 4 extends  {  // 0oku5a da se rede&ni5e metoda # dovodi do priave "re5ke.

    // protected override void #() { +,stem.out.println(-4.#-); }

      // %ede&nisane metode # e do'voleno.  @Override protected void #() { +,stem.out.println(-4.#-); }}

    =

  • 8/16/2019 Vezbe 07 - Abstraktne, Final Klase, Interfejsi

    4/11

    ;rimer 4. ,zvodjenje klase iz 5inal klase"public &nal class #inallass  {  public int x;  public int ,;  }

      // class 6'vedena extends #inallass { } // $%%!% // 7%$+8A9 :6'vedena: cannot inerit ain()  { // 8reiramo obekat &nal klase? punimo "a i ispisuemo podatke  #inallass sc @ ne #inallass ();  sc.x @ C;  sc., @ C;  +,stem.out.println(-x @ -E sc.x E-? , @ -E sc.,);  }  }  // !utput9 x @ C? , @ C

     

    >

  • 8/16/2019 Vezbe 07 - Abstraktne, Final Klase, Interfejsi

    5/11

    -$.E/E12-

    • %ip podatka• Ključna reč" interface•  Najčešće naziv počinje slovom I -npr. IMojInterfejs/•  Najviši nivo apstrakcije• Sadri samo deklaracije članica klase1 koje moraju biti implementirane u klasama koje

    nasleuju taj interfejs• Klasa moe da implementira više interfejsa• Kada klasa ili struktura implementira interfejs1 dobija samo naziv i potpis metoda1 zato

    što interfejs ne sadri implementacije.• ;redstavlja apstraktan tip koji se ne moe instancirati

    6>o6ntero6nter

  • 8/16/2019 Vezbe 07 - Abstraktne, Final Klase, Interfejsi

    6/11

    !va najčešće korišćena razloga za korišćenje interfejsa su"2. Smanjivanje zavisnosti u kodu4. @a implementiranje polimorfnog ponašanja -različiti objekti mogu biti korišćeni od straneistog koda zato što dele isti interfejs/

    • Klasa implementira interfejs ključnom rečju implements

    • Klasa moe implementirati više interfejsa

    [attributes] [modifiers] interface -$ame[implements base3t6pe[]]" bod6 [8]# 

    • !a bi implementirao člana interfejsa1 odgovarajući član klase mora biti ja!no dostupan* public+ ne statičan *non-static+ i treba da ima isto ime i potpis kao član interfejsa.

    VAŽ$&(

    • ,nterfejs može da nasledi više drugih interfejsa  pomoću extends a ne implements5

    • Klasa koja implementira interfejs koji nasleuje druge interfejse mora da definiše svemetode svih nasleenih interfejsa -u suprotnom kompajler javlja grešku/

  • 8/16/2019 Vezbe 07 - Abstraktne, Final Klase, Interfejsi

    7/11

    @A!A%AK 2"

    !efinisati interfejs -%r!i sa metodom void pr!i-/!efinisati interfejs -9ru:i sa metodom void dru:i-/!efinisati interfejs -;la!ni sa metodom void :la!ni-/1 nasleuje interfejse -%r!i i -9ru:i 

    !efinisati klasu )snovna koja implementira interfejs -;la!ni opisanu preko"• ;ublic polja opis"String• &edefinisane metode void :la!ni-/" podešava opis na *B6ACN,+• &edefinisane !irtualne metode void pr!i-/" podešava opis na *;&C,+• &edefinisane metode void dru:i-/" podešava opis na *!&0B,+

    !efinisati klasu -!edena izvedenu iz klase &sno!na opisanu preko"• ;ublic polja b"int• &edefinisane metode void pr!i-/" podešava opis na *,@C'!'NA ;&C,+

    0 glavnom delu programa"• Kreirati instance klase &sno!na• ;odesiti vrednost polja opis na *)SN)CNA+• ;ozvati sve metode interfejsa preko instance klase &sno!na

    • Kreirati instance interfejsa -;la!ni za klasu &sno!na• ;ozvati sve metode interfejsa preko instance interfejsa

    • Kreirati instance klase -!edena• ;odesiti vrednost polja opis na *,@C'!'NA+ a b na ?• ;ozvati sve metode interfejsa preko instance klase -!edena

    • Kreirati instance interfejsa -;la!ni za klasu -!edena• ;ozvati sve metode interfejsa preko instance interfejsa

    • !a li su sledeće komande dozvoljene"

    IPrvi iprvi = new Osnovna();

    iprvi.prvi();

    iprvi.drugi();

    Idrugi idrugi = new Izvedena();idrugi.prvi();

    idrugi.drugi();

    D

  • 8/16/2019 Vezbe 07 - Abstraktne, Final Klase, Interfejsi

    8/11

    &'E'N7'"

     public interface IPrvi {

    void  prvi();

    }

     public interface IDrugi {void  drugi();

    }

     public interface IGlavni extends IPrvi, IDrugi{

    void  glavni();

    }

     public class Osnovna implements IGlavni{

     public Sring opis;

    !! "eoda iner#e$sa IGlavni

    @Override

     public void  glavni() {opis = %G&'I%;

      S*se".out.prinln(opis);

    }

    !! "eoda iner#e$sa IPrvi

    @Override

     public void  prvi() {

    opis = %P+I%;

      S*se".out.prinln(opis);

    }

    !! "eoda iner#e$sa IDrugi

    @Override public void  drugi() {

    opis = %D+GI%;

      S*se".out.prinln(opis);

    }

    }

     public class Izvedena extends Osnovna {

       public int -;

      @Override 

     public void  prvi(){

      opis = %I/D/' P+I%;

      S*se".out.prinln(opis);

      }

    }

    F

  • 8/16/2019 Vezbe 07 - Abstraktne, Final Klase, Interfejsi

    9/11

     public class Glavna {

     public static void  "ain(Sring01 args) {

      Osnovna o = new Osnovna();  o.opis = %OSO'%;

    S*se".out.prinln(o.opis); !! OSO'

      o.glavni(); !! G&'I

      o.prvi(); !! P+I

      o.drugi(); !! D+GI

      IGlavni i" = new Osnovna();

      !! i".opis = %PO2/3'4%; !! G+/S4', ne poso$i

    i".glavni(); !! G&'I

      i".prvi(); !! P+I

      i".drugi(); !! D+GI

      Izvedena iz = new Izvedena();  iz.opis = %I/D/'%;

      iz.- = 5;

      S*se".out.prinln(iz.opis6%, %6iz.-); !! I/D/', 5

      iz.glavni(); !! G&'I

      iz.prvi(); !! I/D/' P+I

      iz.drugi(); !! D+GI

      IGlavni i"7 = new Izvedena();

      !!i"7.opis = %PO2/3'4%; !! G+/S4', ne poso$i

    i"7.glavni(); !! G&'I

      i"7.prvi(); !! I/D/' P+I

      i"7.drugi(); !! D+GI

      IPrvi iprvi = new Osnovna();

      iprvi.prvi(); !! P+I

      !! iprvi.drugi(); !! G+/S4', ne poso$i

    IDrugi idrugi = new Izvedena();

      !! idrugi.prvi(); !! G+/S4', ne poso$i

    idrugi.drugi(); !! D+GI

    }

    }

     

    G

  • 8/16/2019 Vezbe 07 - Abstraktne, Final Klase, Interfejsi

    10/11

     NA;)('NA" ,N%'&5'7S, 3 'KS;6,9,%NA ,(;6'('N%A9,7A

    Ako klasa implementira dva interfejsa koji sadre člana sa istim potpisom u klasi koja ihimplementira definisaće se samo jedan metod za razliku od 9H koji dozvoljava oba sa naznakomiz kojeg je interfejsa

     public interface I2onrol {

    void  pain();

     public interface ISur#a8e {

    void  pain();

    }

     public class Sa"ple2lass implements I2onrol, ISur#a8e {

    @Override

     public void  pain() {

    S*se".out.prinln(%P'I3%);

    }

    }

     public class Glavna {

     public static void  "ain(Sring01 args) {

    Sa"ple2lass s = new Sa"ple2lass();

    s.pain(); !! P'I3

    I2onrol i8 = new Sa"ple2lass();

    i8.pain(); !! P'I3

    ISur#a8e is = new Sa"ple2lass();is.pain(); !! P'I3

    }

    }

    2I

  • 8/16/2019 Vezbe 07 - Abstraktne, Final Klase, Interfejsi

    11/11

    ,N%'&5'7S vs A;S%&AK%NA K6ASA

    • ,nterfejs ne može da implementira metode.• Apstraktna klasa može da implementira metode.

    • ,nterfejs može da nasledi samo drugi interfejs -ne apstraktne ilikonkretne klase/.

    • Apstraktna klasa moe da nasledi jednu klasu1 a implementira višeinterfejsa.

    • ,nterfejs ne sadri polja.•

    Apstraktna klasa može da sadri polja.

    • ,nterfejs može sadrati definiciju svojstava.• Apstraktna klasa može da implementira svojstvo.

    • ,nterfejs podrža!a višestruko nasleivanje.• Apstraktna klasa ne podrža!a višestruko nasleivanje.

    C'@$A"!efinisati klasu ;redmet sa poljima1 naziv1 br$odova.!efinisati abstraktnu klasu )soba sa poljima ime i prezime1 konstruktorom.!efinisati ,nterfejs polaganje sa metodama"

    •void dosaoNa;olaganje-/1 uvećava br;olaganja•void polozio-;redmet/1 dodaje broj bodova predmeta na broj ostvarenih bodova• bool ostvario0slov-/1 proverava da li je ostvareni broj bodova veći od >F

    !efinisati klasu Student izveden iz )sobe sa poljem br$odova1 br;olaganja koji implementiraisnterfejs ;olaganje.0 glavnom program demonstrirati kreirane funkcionalnosti klase student preko interfejsa.

    22