29
Java te Java te č č aj aj 2b. dio 2b. dio Apstraktni razredi. Apstraktni razredi. Su Su č č elja. elja. Java-projekt @ ZEMRIS © 2012.

Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

Java teJava teččajaj2b. dio2b. dio

Apstraktni razredi. Apstraktni razredi. SuSuččelja.elja.

Java-projekt @ ZEMRIS

© 2012.

Page 2: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

Apstraktni razredApstraktni razred

Pretpostavimo da na raspolaganju Pretpostavimo da na raspolaganju imamo razred imamo razred Slika:Slika:–– public public intint getSirinagetSirina() {...}() {...}–– public public intint getVisinagetVisina() {...}() {...}–– public void public void upaliTocku(intupaliTocku(int x, x, intint y) {...}y) {...}–– public void public void ugasiTocku(intugasiTocku(int x, x, intint y) {...}y) {...}

Page 3: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

Apstraktni razredApstraktni razred

Kako najlakKako najlakšše postie postićći da se nai da se našši i geometrijski likovi mogu geometrijski likovi mogu iscrtavatiiscrtavati??ProProšširimo razred irimo razred GeometrijskiLikGeometrijskiLik s s dvije metode:dvije metode:–– public public booleanboolean sadrziTocku(intsadrziTocku(int x, x, intint y) y)

{...}{...}–– public void public void popuniLik(SlikapopuniLik(Slika slikaslika) )

{...}{...}

Page 4: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

Apstraktni razredApstraktni razred

Zadatak metode Zadatak metode sadrziTockusadrziTocku jest jest utvrditi sadrutvrditi sadržži li trenutni lik predanu i li trenutni lik predanu totoččku (ku (x,yx,y))No kako to utvrditi? No kako to utvrditi? GeometrijskiLikGeometrijskiLikje bazni razred za svaki lik je bazni razred za svaki lik ––informacija koje toinformacija koje toččke lik sadrke lik sadržži i ovdje nije dostupnaovdje nije dostupna

Page 5: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

Apstraktni razredApstraktni razred

RjeRješšenje 1enje 1–– sadrsadržžiToiToččkuku uvijek vrauvijek vraćća a falsefalse–– Svaki razred koji Svaki razred koji nasljedinasljedi

GeometrijskiLikGeometrijskiLik moramora overrideoverride--atiatinavedenu metodu kako bi ispravno navedenu metodu kako bi ispravno vravraććao informaciju o sadrao informaciju o sadržžanim toanim toččkamakama

Page 6: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

Apstraktni razredApstraktni razred

Zadatak metode Zadatak metode popuniLikpopuniLik jest jest nacrtati sliku likanacrtati sliku likaNemoguNemogućće bez da znamo koji je to e bez da znamo koji je to lik?lik?–– Ne! MoNe! Možžda neefikasno, ali ne i da neefikasno, ali ne i

nemogunemogućće!e!–– Za svaku toZa svaku toččku slike pitaj lik sadrku slike pitaj lik sadržži li tu i li tu

totoččku, i ako da, upali je!ku, i ako da, upali je!

Page 7: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

Apstraktni razredApstraktni razredpublic class public class GeometrijskiLikGeometrijskiLik {{

......public public booleanboolean sadrziTocku(intsadrziTocku(int x, x, intint y) {y) {

return false;return false;}}public void public void popuniLik(SlikapopuniLik(Slika slikaslika) {) {

......}}

}}

Page 8: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

Apstraktni razredApstraktni razred

public class public class Linija Linija extendsextends GeometrijskiLikGeometrijskiLik {{......public public booleanboolean sadrziTocku(intsadrziTocku(int x, x, intint y) {y) {

…… nova implementacija nova implementacija ……}}

}}

Page 9: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

Apstraktni razredApstraktni razred

ZahvaljujuZahvaljujućći i polimorfizmupolimorfizmu, metoda , metoda popuniLikpopuniLik ćće za svaki konkretan lik e za svaki konkretan lik pozivati njegovu redefiniranu metodu pozivati njegovu redefiniranu metodu sadrziTockusadrziTocku((……), i uspje), i uspješšno obaviti no obaviti crtanjecrtanje

Page 10: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

Apstraktni razred Apstraktni razred –– primjer 1primjer 1publicpublic staticstatic voidvoid mainmain((StringString[] [] argsargs) {) {Slika slika = Slika slika = newnew Slika(40, 40);Slika(40, 40);

Linija l1 = Linija l1 = newnew Linija(10, 10, 30, 30);Linija(10, 10, 30, 30);l1.popuniLik(slika);l1.popuniLik(slika);

Pravokutnik p = Pravokutnik p = newnew Pravokutnik(2, 20, 10, 15);Pravokutnik(2, 20, 10, 15);p.popuniLikp.popuniLik(slika);(slika);

Pravokutnik p2 = Pravokutnik p2 = newnew Pravokutnik(30, 4, 2, 2);Pravokutnik(30, 4, 2, 2);p2.popuniLik(slika);p2.popuniLik(slika);

slika.nacrtajSlikuslika.nacrtajSliku((System.System.outout););}}

Page 11: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

Apstraktni razredApstraktni razred

Opisana metoda Opisana metoda popuniLikpopuniLik je spora!je spora!Konkretni likovi mogu obaviti Konkretni likovi mogu obaviti redefiniranje i te metode, i dodatno redefiniranje i te metode, i dodatno je ubrzati.je ubrzati.PrimjericePrimjerice–– Linija: Linija: bresenhamovbresenhamov postupakpostupak–– Pravokutnik: dvije ograniPravokutnik: dvije ograniččene ene forfor petljepetlje

Page 12: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

Apstraktni razredApstraktni razred

Ponovno rjePonovno rješšenje 1enje 1–– sadrsadržžiToiToččkuku uvijek vrauvijek vraćća a falsefalse–– Svaki razred koji Svaki razred koji nasljedinasljedi

GeometrijskiLikGeometrijskiLik moramora overrideoverride--atiatinavedenu metodu kako bi ispravno navedenu metodu kako bi ispravno vravraććao informaciju o sadrao informaciju o sadržžanim toanim toččkamakama

–– ----------------------------------------------------------------------------------------–– Kako postiKako postićći ovaj i ovaj moramora??

Page 13: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

Apstraktni razredApstraktni razred

RjeRješšenje 2enje 2–– Objektno orijentirana paradigma Objektno orijentirana paradigma

poznaje pojam poznaje pojam apstraktne metodeapstraktne metode ––metoda za koju se definira signatura, ali metoda za koju se definira signatura, ali ne i implementacija:ne i implementacija:public public abstractabstract booleanboolean sadrziTocku(intsadrziTocku(int x, x, intint y)y);;

–– Razred koji sadrRazred koji sadržži barem jednu ovakvu i barem jednu ovakvu metodu također je apstraktan i mora metodu također je apstraktan i mora biti definiran kao:biti definiran kao:publicpublic abstractabstract classclass ImeRazredaImeRazreda {{……}}

Page 14: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

Apstraktni razredApstraktni razred

RjeRješšenje 2enje 2–– Apstraktni razredi ne mogu se Apstraktni razredi ne mogu se

instanciratiinstancirati, jer nisu potpuno definirani, jer nisu potpuno definirani–– Apstraktni razred nuApstraktni razred nužžno je naslijediti!no je naslijediti!–– Razred koji ga nasljeđuje moRazred koji ga nasljeđuje možže e

definirati sve njegove apstraktne definirati sve njegove apstraktne metode, ali i ne mora metode, ali i ne mora –– tada je i on tada je i on apstraktan i ne moapstraktan i ne možže se e se instanciratiinstancirati

Page 15: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

Apstraktni razredApstraktni razred

Uporaba apstraktnih razredaUporaba apstraktnih razreda–– Ponuditi osnovu za definiranje drugih Ponuditi osnovu za definiranje drugih

razredarazreda–– Nudi implementaciju svih dijeljenih Nudi implementaciju svih dijeljenih

algoritamaalgoritama–– Metode u kojima se konkretni razredi Metode u kojima se konkretni razredi

razlikuju definira apstraktnima, razlikuju definira apstraktnima, ččime ih ime ih prisiljava da ih definirajuprisiljava da ih definiraju

Page 16: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

SuSuččeljaelja

SuSuččelje moelje možžemo poistovjetiti sa emo poistovjetiti sa potpuno apstraktnim razredom potpuno apstraktnim razredom ––razredomrazredom koji definira niz apstraktnih koji definira niz apstraktnih metodametodaJava ipak razlikuje razred od suJava ipak razlikuje razred od suččeljaeljaSuSuččelje se definira kljuelje se definira ključčnom rijenom riječči i interfaceinterface (a ne (a ne classclass kao kod kao kod razreda)razreda)

Page 17: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

SuSuččeljaelja

SuSuččelje moelje možžemo definirati kao popis emo definirati kao popis metoda koje svaki razred koji ga metoda koje svaki razred koji ga implementira ima definiraneimplementira ima definiraneTerminoloTerminološški, rki, razredi se nasljeđujuazredi se nasljeđuju::classclass A A extendsextends B {}B {}a sua suččelja implementiraju:elja implementiraju:classclass A A implementsimplements I {}I {}

Page 18: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

SuSuččeljaelja

Za razliku od modela nasljeđivanja Za razliku od modela nasljeđivanja gdje razred mogdje razred možže imati samo jednog e imati samo jednog roditelja, Java razredima dozvoljava roditelja, Java razredima dozvoljava da implementiraju proizvoljan broj da implementiraju proizvoljan broj susuččelja:elja:

classclass A A implementsimplements I1, I2, I3 I1, I2, I3 {{……}}

Page 19: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

SuSuččeljaelja

SuSuččelja i nasljeđivanje se međusobno elja i nasljeđivanje se međusobno ne iskljune isključčuju! Primjerice, ispravno je uju! Primjerice, ispravno je napisati:napisati:

classclass B B extendsextends A A implementsimplements I1, I1, I2, I3 {I2, I3 {……}}

Page 20: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

SuSuččeljaelja

Kako najlakKako najlakšše postie postićći da se nai da se našši i geometrijski likovi mogu geometrijski likovi mogu iscrtavatiiscrtavati??Umjesto da proUmjesto da prošširimo razred irimo razred GeometrijskiLikGeometrijskiLik s dvije metode:s dvije metode:–– public public booleanboolean sadrziTocku(intsadrziTocku(int x, x, intint y) y)

{...}{...}–– public void public void popuniLik(SlikapopuniLik(Slika slikaslika) )

{...}{...}

Page 21: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

SuSuččeljaelja

Napravimo sljedeNapravimo sljedećće: definirajmo e: definirajmo susuččelje elje SadrziocTocakaSadrziocTocaka::

interfaceinterface SadrziocTocakaSadrziocTocaka {{

public public booleanboolean sadrziTocku(intsadrziTocku(int x, x, intint y)y);;}}

Page 22: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

SuSuččeljaelja

Za svaki konkretan lik recimo da Za svaki konkretan lik recimo da implementira suimplementira suččelje elje SadrziocTocakaSadrziocTocaka, i definirajmo , i definirajmo potrebne metode; npr.:potrebne metode; npr.:

classclass Linija Linija extendsextends GeometrijskiLikGeometrijskiLikimplementsimplements SadrziocTocakaSadrziocTocaka {{public public booleanboolean sadrziTocku(intsadrziTocku(int x, x, intint y)y){{……}}

}}

Page 23: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

SuSuččeljaelja

Za svaki konkretan lik recimo da Za svaki konkretan lik recimo da implementira suimplementira suččelje elje SadrziocTocakaSadrziocTocaka, i definirajmo , i definirajmo potrebne metode; npr.:potrebne metode; npr.:

classclass Pravokutnik Pravokutnik extendsextends GeometrijskiLikGeometrijskiLikimplementsimplements SadrziocTocakaSadrziocTocaka {{public public booleanboolean sadrziTocku(intsadrziTocku(int x, x, intint y)y){{……}}

}}

Page 24: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

SuSuččeljaelja

Razred Kvadrat ne mora Razred Kvadrat ne mora implementirati implementirati SadrziocTocakaSadrziocTocaka –– on on to to ččini samom ini samom ččinjenicom da injenicom da nasljeđuje razred Pravokutniknasljeđuje razred PravokutnikMoMožže redefinirati potrebne metode e redefinirati potrebne metode zbog brzine izvođenja zbog brzine izvođenja (ako ih mo(ako ih možže e implementirati brimplementirati bržže)e)

Page 25: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

SuSuččeljaeljaMetodu za crtanje prebacimo u razred Slika:Metodu za crtanje prebacimo u razred Slika:

classclass Slika {Slika {……..

publicpublic voidvoid popuniLikpopuniLik((SadrziocTocakaSadrziocTocaka lik) {lik) {forfor((intint y=0; y<visina; y++) {y=0; y<visina; y++) {forfor((intint x=0; x<x=0; x<sirinasirina; x++) {; x++) {ifif((lik.sadrziTockulik.sadrziTocku(x, y)) {(x, y)) {

upaliTockuupaliTocku(x, y);(x, y);}}

}}}}

}}}}

Page 26: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

Apstraktni razred Apstraktni razred –– primjer 2primjer 2publicpublic staticstatic voidvoid mainmain((StringString[] [] argsargs) {) {Slika Slika slikaslika = = newnew Slika(40, 40);Slika(40, 40);

Linija l1 = Linija l1 = newnew Linija(10, 10, 30, 30);Linija(10, 10, 30, 30);slika.popuniLikslika.popuniLik(l1);(l1);

Pravokutnik p = Pravokutnik p = newnew Pravokutnik(2, 20, 10, 15);Pravokutnik(2, 20, 10, 15);slika.popuniLikslika.popuniLik(p);(p);

Pravokutnik p2 = Pravokutnik p2 = newnew Pravokutnik(30, 4, 2, 2);Pravokutnik(30, 4, 2, 2);slika.popuniLikslika.popuniLik(p2);(p2);

slika.nacrtajSlikuslika.nacrtajSliku((System.System.outout););}}

Page 27: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

SuSuččelja elja vsvs apstraktni razrediapstraktni razredi

Apstraktni razred je Apstraktni razred je –– razredrazred–– Dobro rjeDobro rješšenje za definirati osnovu za enje za definirati osnovu za

izvođenje novih razredaizvođenje novih razreda–– MoMožže ponuditi implementaciju e ponuditi implementaciju

zajednizajedniččkih algoritamakih algoritama

Page 28: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

SuSuččelja elja vsvs apstraktni razrediapstraktni razredi

SuSuččelje je elje je –– ““popispopis””!!–– Dobro rjeDobro rješšenje za dodavanje enje za dodavanje

““karakteristikakarakteristika”” postojepostojeććim razredimaim razredima–– Funkcionira neovisno o strukturi Funkcionira neovisno o strukturi

nasljeđivanjanasljeđivanja: razred koji ve: razred koji većć ima ima definiranu strukturu nasljeđivanja modefiniranu strukturu nasljeđivanja možže e implementirati proizvoljna suimplementirati proizvoljna suččeljaelja

Page 29: Java tečajjava.zemris.fer.hr/opjj/p03/java_tecaj_02-b_prezentacija.pdf · Apstraktni razred Kako najlakše postići da se naši geometrijski likovi mogu iscrtavati? Proširimo razred

SuSuččelja elja vsvs apstraktni razrediapstraktni razredi

SuSuččelje je elje je –– ““popispopis””!!–– Izuzetno Izuzetno ččesto koriesto koriššteni u Javiteni u Javi–– Susrest Susrest ććemo se s njima uskoro kod emo se s njima uskoro kod

CollectionCollection FrameworkaFrameworka i i SwingaSwinga–– OmoguOmoguććava razdvajanje implementacije ava razdvajanje implementacije

i i ““obeobeććaneane”” funkcionalnostifunkcionalnosti–– MoMožže se shvatiti i kao e se shvatiti i kao ““pogledpogled”” kroz koji kroz koji

se vidi neki objektse vidi neki objekt