UVOD U OBJEKTNO-ORIJENTISANO PROGRAMIRA;E. U основи објектно-
оријентисаног програмирана (дале ООП) лежи идеја об- јединавана у једној
...
NASTAVA RAQUNARSTVA
Milan Qabarkapa UVOD U OBJEKTNO-ORIJENTISANO PROGRAMIRA;E U osnovi objektno-orijentisanog programiraa (dae OOP) lei ideja objediavaa u jednoj strukturi podataka i akcija nad ima (koje se u terminologiji OOP nazivaju metode). To znaqi da pri ovakvom pristupu organizaciji podataka, za razliku od tradicionalnog, tesnija je veza izme u podataka i akcija. OOP omogu ava efikasniji rad programera time xto se kreiraju kompaktniji i lako proxirivi programi. Iako e neki pojmovi OOP-a moda na prvi pogled izgledati nejasni, napor da se ovlada novim pristupom programiraa vixestruko e se isplatiti. OOP se bazira na tri osnovna pojma: inkapsulacija, nasle ivae i polimorfizam. Inkapsulacija je kombinovae podataka sa procedurama i funkcijama koje operixu sa tim podacima. Kao rezultat se dobija novi tip koji se naziva objekt. Nasleivae je mogu nost korix ea ve definisanih objekata za gra ee hijerarhije objekata, izvo eem iz ih. Svaki ,,naslednik\ nasle uje opise podataka ,,praroditea\ i pristup metodama ihove obrade. Polimorfizam je mogu nost definisaa jedinstvenog po imenu metoda (procedure ili funkcije), primenivog istovremeno ka svim objektima hijerarhije nasle ivaa, pri qemu svaki objekt hijerarhije moe naznaqiti specifiqnosti realizacije te akcije nad ,,im samim\.
Objekti. Osnovni pojmovi
Formalno posmatraju i objekti su vrlo sliqni slogovima u PASCAL-u. je struktura qije su komponente uzajamno povezani podaci raznih tipova, kao i procedure i funkcije koje koriste te podatke. Komponente-podaci se nazivaju poa objekta, a komponente-procedure i funkcije se nazivaju metode. Za oznaqavae tipa ,,objekt\ u TURBO PASCAL-u se koristi rezervisana req object. Objektni tip se opisuje sliqno slogu u PASCAL-u:
Objekt
type ImeObjekta=object PoljaPodataka ZaglavljaMetoda end
Konkretna promeniva, deklarisana tipom ImeObjekta, naziva se primerak tog tipa.
Uvod u objektno-orijentisano programirae
49
Neposredno u objektnom tipu se zadaju samo zaglava metoda (procedura ili funkcija), a ihovi potpuni opisi se zadaju odvojeno u odeku opisa funkcija i procedura, samo se tada ime metoda formira od imena objektnog tipa kome pripada metod, simbola ,,taqka\ i imena procedure ili funkcije. Zaglava metoda pri ihovoj realizaciji ne moraju sadrati spisak formalnih parametara, podrazumeva se da ihovi opisi u objektu kao da imaju direktivu forward. Na primer, objektni tip kojim se opisuje taqka i osnovne operacije nad taqkom moe se opisati na slede i naqin: type Point=object X,Y,Color:integer procedure Create(PosX,PosY,C:integer) procedure SwitchOn procedure SwitchOff procedure Move(dx,dy:integer) function GetX:integer function GetY:integer end
Poa X,Y,Color quvaju informaciju o poloaju taqke i kako je taqka obojena. Me utim, objekt ne sadri samo informaciju (kordinate taqke i enu boju) ve i metode kojim se zadaju operacije nad taqkom: kreirae taqke (zadavaem koordinata i boje) | Create, eno ,,paee\ i ,,gaxee\ | SwitchOn i SwitchOff, pomerae po ekranu | Move, i detekciju trenutnog poloaja taqke | GetX i GetY: procedure Point.Create(PosX,PosY,C:integer) begin X:=PosX Y:=PosY Color:=C end procedure Point.SwitchOn begin PutPixel(X,Y,Color) end procedure Point.SwitchOff begin PutPixel(X,Y,GetBkColor) end procedure Point.Move(dx,dy:integer) begin SwitchOff X:=X+dxY:=Y+dy SwitchOn end function Point.GetX:integer begin GetX:=X end function Point.GetY:integer begin GetY:=Y end
50
M. Qabarkapa
Objektni pristup podrazumeva da u programu deklarisani objekt sadri iscrpne podatke o odgovaraju em ,,fiziqkom\ objektu, da se metode koliko je to mogu e obra aju jedna drugoj i poima podataka svog objekta. Bez obzira xto su opisi metoda odvojeni od definicije objektnog tipa, oni imaju pristup svim egovim poima podataka. Primerak objekta se deklarixe na slede i naqin: var TestPt:Point
i s im se operixe posredstvom egovih metoda: TestPt.Create(100,200,GetMaxColor) f* zadaje tacku *g TestPt.SwitchOn f* pali tacku *g TestPt.Move(20,-10) f* gasi tacku i pali na novoj poziciji *g TestPt.SwitchOff f* gasi tacku *g
U zaglavu naredbe with moe se staviti i primerak objektnog tipa, tako da se metodama moe pristupati a da se ne ponava ime primerka objekta: with TestPt do begin Create(100,200,GetMaxColor) f* zadaje tacku *g SwitchOn f* pali tacku *g Move(20,-10) f* gasi tacku i pali na novoj poziciji *g SwitchOff f* gasi tacku *g end
Poima objektnog tipa moe se pristupati ne samo korix eem metoda objekta, ve i neposredno kao poima obiqnog sloga: TestPt.X:=100 TestPt.Y:=200 TestPt.Color:=GetMaxColor
Me utim, ovim se odstupa od objektno-orijentisanog stila po kome se sve operacije nad informacijom zadatom u objektnom tipu ostvaruju posredstvom egovih metoda. Naruxavaem ovog pravila mogu se izgubiti preimu stva objektnog pristupa programirau. Pri opisu objekata treba voditi raquna o slede im zahtevima: opis tipa ,,objekt\ moe se kreirati samo u odeku za opis tipova type osnovnog programa ili u odecima modula ne smeju se opisivati lokalni objekti u procedurama i funkcijama pri opisu objekta poa podataka se moraju nalaziti ispred opisa metoda komponente objekta ne mogu biti fajlovi, a fajlovi ne mogu sadrati komponente tipa ,,objekt\. Slede i program testira objekt Point tako xto zavisno od toga koja je strelica na tastaturi pritisnuta pomera taqku u odgovaraju em smeru. Program se prekida pritiskom na taster ESC. program DemoObj uses crt,graph type Point=object X,Y,Color:integer procedure Create(PosX,PosY,C:integer) procedure SwitchOn
Uvod u objektno-orijentisano programirae procedure SwitchOff procedure Move(dx,dy:integer) function GetX:integer function GetY:integer end procedure Point.Create(PosX,PosY,C:integer) begin X:=PosX Y:=PosY Color:=C end procedure Point.SwitchOn begin PutPixel(X,Y,Color) end procedure Point.SwitchOff begin PutPixel(X,Y,GetBkColor) end procedure Point.Move(dx,dy:integer) begin SwitchOff X:=X+dxY:=Y+dy SwitchOn end function Point.GetX:integer begin GetX:=X end function Point.GetY:integer begin GetY:=Y end var TestPt:Point GDriver,GMode,MaxC,i:integer ch:char begin GDriver:=Detect InitGraph(GDriver,GMode,'c:ntp60nbgi') if GraphResult0 then begin writeln('Greska pri inicijalizaciji grafike') halt(1) end ClearDevice MaxC:=GetMaxColor TestPt.Create(GetMaxX div 2,GetMaxY div 2,MaxC) TestPt.SwitchOn repeat with TestPt do begin ch:=ReadKey if ch=#0 then begin ch:=ReadKey case ch of #75:Move(-1,0) f* taqka levo *g
51
52
M. Qabarkapa #77:Move(+1,0) f* taqka desno *g #72:Move(0,-1) f* taqka gore *g #80:Move(0,+1) f* taqka dole *g end end
end until ch=#27 CloseGraph end.
Ako se program testira bez SwitchOff u metodi Point.Move ostava se trag na putai taqke.
Nasleivae i preklapae Vano svojstvo objektnih tipova je da omogu avaju da se pri kreirau novog objektnog tipa iskoristi prethodno definisan objektni tip. Neka je, na primer, potrebno kreirati objektni tip koji uprava prostom geometrijskom figurom { krugom { na ekranu monitora. Oqigledno je da je struktura informacija za definisae kruga vrlo sliqna opisu strukture taqke: i { definixu poloaj centra kruga i Color { boju kruga. Potrebno je jox dodati poe za quvae polupreqnika kruga. Objektno-orijentisani stil omogu ava definisae novog objekta kao potomka drugog prethodno definisanog tipa. Time novi tip automatski raspolae sa svim poima i metodama prethodno uvedenog tipa, koji se naziva pretkom ili roditeskim tipom. U tom sluqaju se u definiciji tipa-potomka mora navesti (u zagradama posle slubene reqi object) ime roditeskog tipa:
X Y
type ImeObjektaNaslednika=object (ImeObjektaRoditelja) NovaPoljaObjektaNaslednika NoveMetodeObjektaNaslednika end
Na primer, moe se opisati objekt na slede i naqin: type Circle=object (Point) Radius:integer end
Zadavae roditeskog tipa oznaqava da su u objektnom tipu Circle implicitno prisutna sva poa i metode iz tipa Point. Ako se deklarixe: var Circle1:Circle
moe se pristupati poima i metodama na slede i naqin: Circle1.Create(150,300) Circle1.Radius:=50
Opisano svojstvo objektnih tipova naziva se nasleivae i xiroko se koristi u objektno-orijentisanom programirau. Treba imati na umu da jedan tip moe biti predak proizvonom broju tipova-potomaka, dok svaki objektni tip moe naslediti poa i metode samo jednog tipa-roditea, koji se zadaje u ovalnim zagradama.
Uvod u objektno-orijentisano programirae
53
Tip potomak moe, sa svoje strane, biti predak drugom objektnom tipu (tipovima). Tako se moe definisati figura ,,prsten\ koja se sastoji iz dva koncentriqna kruga: type Ring=object (Circle) Radius2:integer end
Tip Ring nasle uje poe Radius od neposrednog pretka Circle, a poa i metode iz tipa Point koji mu je indirektni predak. Duina ovakvog lanca nasle ivaa nije ograniqena. Metodi kojim raspolae Point nisu dovoni za operacije sa krugom. Dok se metodi GetX i GetY mogu iskoristiti u tipu potomku da bi vratile koordinate centra, metode SwitchOn i SwitchOff ne obezbe uju crtae kruga. Zato, zajedno sa novim poem Radius potpun opis tipa Circle mora sadrati sopstvene metode za crtae, uklaae i pomerae kruga po ekranu. Najprostije rexee je da se u novi tip uvedu takve metode sa novim imenima. Me utim, objektno-orijentisani pristup dozvoava definisae novih metoda sa starim imenima, preklapajui na taj naqin roditeske tipove: type Circle=object (Point) Radius:integer procedure Create(PosX,PosY,C,R:integer) procedure SwitchOn procedure SwitchOff procedure Move(dx,dy:integer) function GetR:integer end procedure Circle.Create(PosX,PosY,C,R:integer) begin Point.Create(PosX,PosY,C) Radius:=R end procedure Circle.SwitchOn begin Graph.SetColor(Color) f* koristi proceduru modula Graph *g Graph.Circle(X,Y,Radius) f* ukazuje da se radi o proceduri modula Graph *g end procedure Circle.SwitchOff begin Graph.SetColor(GetBkColor) Graph.Circle(X,Y,Radius) end procedure Circle.Move(dx,dy:integer) begin SwitchOff X:=X+dxY:=Y+dy SwitchOn end function Circle.GetR:integer begin GetR:=Radius end
Ovaj opis objektnog tipa Circle sadri slede e elemente:
54
M. Qabarkapa
X Y
poa , , Color nasle ena od roditeskog tipa Point sopstveno poe Radius metod Circle.Create koji inicijalizuje poa objekta Circle. Ovaj metod preklapa unutar tipa Circle od Point nasle eni metod Point.Create. Moe se primetiti da se za inicijalizaciju poa , , Color poziva metod Point.Create koji je dostupan (nasle ivaem) tipu Circle metode Circle.SwitchOn, Circle.SwitchOff i Circle.Move crtaju, uklaaju i pomeraju krug. Ove metode potpuno preklapaju istoimene metode iz Point, xto je razumivo jer crtae kruga se razlikuje od crtaa taqke. Poxto standardna procedura za crtae kruga ima tako e naziv Circle, radi jednoznaqne identifikacije koristi se sloeno ime Graph.Circle (prema modulu Graph u kome se nalazi procedura) novi metod GetR radi pristupa teku oj vrednosti polupreqnika kruga dva nasle ena metoda GetX i GetY za dobijae teku ih koordinata centra kruga. Primetimo: mogu se preklapati samo metode poa roditeskog tipa bezuslovno nasle uje tip-potomak i ne mogu se preklapati (to jest imena poa potomka ne smeju biti ista kao poa tipa-pretka). Osim toga, novi metod u tipu-potomku moe imati parametre razliqite od istoimenog metoda iz tipapretka. Analizirajmo ponaxae objekta tipa Circle pozivaem egovih metoda u slede em programu koji je skoro identiqan programu u kome smo pratili ponaxae taqke:
XY
program DemoObjCircle uses crt,graph type Point=object X,Y,Color:integer procedure Create(PosX,PosY,C:integer) procedure SwitchOn procedure SwitchOff procedure Move(dx,dy:integer) function GetX:integer function GetY:integer end f* opis metoda iz Point koje su vec navedene u tekstu *g ...
type Circle=object (Point) Radius:integer procedure Create(PosX,PosY,C,R:integer) procedure SwitchOn procedure SwitchOff procedure Move(dx,dy:integer) function GetR:integer end f* opis metoda iz Circle koje su vec navedene u tekstu *g ...
var TestCirc:Circle GDriver,GMode,MaxC,i:integer ch:char
Uvod u objektno-orijentisano programirae
55
begin GDriver:=Detect InitGraph(GDriver,GMode,'c:ntp60nbgi') if GraphResult0 then begin writeln('Greska pri inicijalizaciji grafike') halt(1) end ClearDevice MaxC:=GetMaxColor TestCirc.Create(GetMaxX div 2,GetMaxY div 2,MaxC,50) TestCirc.SwitchOn repeat with TestCirc do begin ch:=ReadKey if ch=#0 then begin ch:=ReadKey case ch of #75:Move(-10,0) f* krug levo *g #77:Move(+10,0) f* krug desno *g #72:Move(0,-10) f* krug gore *g #80:Move(0,+10) f* krug dole *g end end end until ch=#27 CloseGraph end.
Programom se crta i brixe krug uz pomerae zavisno od toga koja je strelica pritisnuta na tastaturi raqunara (levo, desno, gore, dole).