Upload
others
View
6
Download
0
Embed Size (px)
Citation preview
Java teJava teččajaj2b. dio2b. dio
Apstraktni razredi. Apstraktni razredi. SuSuččelja.elja.
Java-projekt @ ZEMRIS
© 2012.
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) {...}
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) )
{...}{...}
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
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
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!
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) {) {
......}}
}}
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 ……}}
}}
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
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););}}
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
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??
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 {{……}}
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
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
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)
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 {}
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 {{……}}
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 {……}}
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) )
{...}{...}
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);;}}
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){{……}}
}}
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){{……}}
}}
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)
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);}}
}}}}
}}}}
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););}}
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
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
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