You are on page 1of 43

Saga o OOP

Dragan Masulovic
(u sklopu Vannastavnih aktivnosti iz programiranja, PMF-Novi Sad
!vod
! nar"dnih n"koliko poruka (mozda iz u n"koliko navrata d"sic" s"
Saga o OOP# $d"ja j" da s" na %rzaka da pr"gl"d id"ja koji vodi od
niza %itova, do OOP# Nakon pr"gl"da osnovnih id"ja moz"mo razviti
diskusiju o sp"cijalit"tima kuc" (&orland, 'P$, ###
(r"%a uociti da ovaj pr"gl"d ni pri%lizno n"c" %iti hronoloski,
j"r (v"rovali ili n", prvi j"zik sa "l"m"ntima OO j" nastao u
Sv"dskoj i zvao s" Simula-)*# ! to vr"m" nij" doziv"o n"ku v"liku
sr"cu, ali j" posluzio kao odskocna daska za Smalltalk-+,
(-"ro., Palo /lto 01+,, od koga j" sv" poc"lo#
No, podjimo r"dom (dakl", n"-r"dom, n"-hronoloski#
2lava 0#
3 ! kojoj s" postavlja 4ono4 pitanj"# Pitanj" od koga mnog" stvari
3 stvari pocinju, koga niko n" voli, a na koga s" mnogi nastavnici
3 mrst", kao kada ih uc"nici pitaju da im potanko o%jasn" kako
3 %"%" dolaz" na sv"t#
Sta j" to tip podataka, a sta struktura5 ! c"mu j" razlika izm"dju
ta dva pojma5
6-------------------------------------------------------------------6
7 Pr" n"go sto odgovori na pitanja %udu isporuc"ni, j"dna napom"na8 7
7 ovd" n"c"t" naci 4strog"4 i 49ormaln"4 d"9inicij" pojmova# Samo 7
7 id"j"# :a on" 4prav"4 mat"matick" d"9inicij" j" potr"%no dati 7
7 prilicno n"prijatan uvod u n"koliko za%ac"nih t"orija# O tom" 7
7 drugi put### 7
6-------------------------------------------------------------------6
(ip podataka j" odr"dj"n (konacnim skupom vr"dnosti i n"kim pak"tom
op"racija i r"lacija nad "l"m"ntima tog skupa# Na prim"r,
(;-<=*)+, ###, -0, ,, 0, ###, <=*)*>, 6, -, 4 div, mod, ?, @ j" tip
podataka u narodu poznatiji kao c"lo%rojni tip (ili $N(A2AB#
(o sto s" u programiranju zov" tip podataka jako lici na ono sto
s" u alg"%ri i t"oriji mod"la zov" op"racijsko-r"lacijska
struktura, mada stanovit" (i to :N/(NA razlik" postoj"# O njima
drugom prilikom#
Struktura podataka j" konglom"rat podataka# Ona s" 9ormira od drugih
(j"dnostavnijih struktura i od tipova# '"din" op"racij" koj" s"
nad strukturama mogu o%avljati su op"racij" s"l"kcij"# Posao
op"racija s"l"kcij" j" da iz struktur" izdvoj" j"dan j"dnostavniji
podatak (j"dnu kompon"ntu struktur", ili da nam omoguc" pristup
ka njoj#
Ovd" tr"%a razlikovati strukturu podataka od m"toda struktuiranja
podataka# B"cimo, CCarraDEE j" m"tod struktuiranja, a nakon d"klaracij"
var a 8 arraD F0 ## 0,,G o9 r"alH
CCaEE postaj" struktura# Svaki m"tod struktuiranja ima karakt"risticn"
op"racij" s"l"kcij"# B"cimo, CCarraDEE kao op"raciju s"l"kcij" ima
ind"ksiranj", a CCr"cordEE kao op"raciju s"l"kcij" ima op"raciju koja
s" zov" proj"ktovanj" (u stvari, to j" samo oda%ir polja sloga#
! Pascal-u postoj" tri "ksplicitna m"toda struktuiranja (arraD, r"cord,
r"cord-cas" i j"dan implicitni (pr"ko pokazivaca#
Bazlika izm"dju tipa i struktur" j" u tom" sto j" nad "l"m"ntima tipa
moguc" vrsiti n"kakv" op"racij" i sm"stati ih u n"kakv" r"lacij",
dok j" nad strukturom moguc" o%avljati samo s"l"kciju kompon"nt"#
Malko mat"matik" (ali 4jako4 malko na ovu t"mu c" s" javiti u
Dodatku 0#
2lava =#
3 ! kojoj s" ono sto s" sada svima cini jasno, nacini n"jasnim
$ t"k sto nam s" sjasnilo sta j" to tip, a sta struktura,
pocinj"mo malko da gl"damo po programskim j"zicima# $ uvidjamo da
granica izm"dju ova dva pojma nij" uopst" jasna#
Na prim"r, u Pascal-u su stringovi impl"m"ntirani kao pakovani nizovi
karakt"ra, i tako pr"dstavljaju strukturu# S drug" stran", u &/S$I-u
su stringovi impl"m"ntirani kao osnovni tip (j"r s" na stringovima
u &/S$I-u mogu o%avljati razn" op"racij" i r"lacij"8 nadov"zivanj",
uzimanj" podstringa, ispitivanj" j"dnakosti stringova###
Pr"ma ovom" s" cini da j" stvar ostavlj"na onom" ko dizjanira j"zik#
! j"dnom j"ziku s" n"sto moz" javiti kao tip, a u drugom j"ziku to
isto kao struktura# $ cini s" da smo na taj nacin pomirili
antagonizm"# /li nismoJ
'"r, sta s" d"sava kada u Pascal-u napis"t" pak"t proc"dura koj"
rad" sa stringovima5 B"cimo, kada s" u n"kom programu javi ovako
n"sto8
tDp" S(B ? pack"d arraD F0 ## 0,,G o9 charH
proc"dur" Ioncat(s0, s= 8 S(BH var r"s 8 S(BH ###
proc"dur" Su%str(s 8 S(BH 9rom, to 8 int"g"rH var r"s 8 S(BH ###
9unction Iompar"(s0, s= 8 S(B 8 int"g"rH ###
Nij" li tako S(B postao tip5 $mamo skup vr"dnosti (IK/BL0,, i op"racij"
na "l"m"ntima tog skupa (Ioncat, Su%str, Iompar"# Sv" sto tr"%a da
n"sto %ud" tip ###
55
2lava <#
3 koja, nakon dramsk" pauz", daj" odgovor na pitanj" iz pr"thodn" glav"
'"st"# S(B iz pr"thodn" glav" j" postao tip# Dakl", S(B j", po s"%i,
struktura, ali j" u vr"dnim rukama program"ra postao tip#
Naravouc"nij"8 svaku strukturu moz"mo pr"tvoriti u tip ako j"
sna%d"mo op"racijama koj" rad" (n"sto korisno, ali to nij" o%av"zno
sa njom#
Pr"thodna glava j" d"monstrirala klasican nacin da struktura postan"
tip8 damo strukturi im" i sna%d"mo j" op"racijama# Do%ijamo novi tip#
2lava M#
3 ! kojoj s" vidi zasto j" vazno praviti nov" tipov" i kako c"mo
3 %iti sr"cni kada to %ud"mo radili u OO stilu
:asto j" vazno praviti nov" tipov"5 :%og toga sto j" mnogo laks"
raditi kada s" apstrahuju n"%itni d"talji# ((o su oni d"talji koji
nisu %itni u 4tom4 tr"nutkuH svaki d"talj j" %itan, pr" ili kasnij"J
:a usp"san rad u v"likim timovima i na v"likim proj"ktima %itno
pisati apstraktan kood# :amislit" proj"kt u kom" j" potr"%no raditi
n"sto sa matricama# Naj%olj" j" napraviti tip M/(B$-
(dakl", n"koj strukturi dati im" M/(B$- i onda j" sna%d"ti op"racijama
za rad sa matricama (sa%iranj", mnoz"nj", inv"rtovanj", ###, pa kada
dodj" do r"savanja konkr"tnog pro%l"ma, samo pozivati gotov"
(i t"stiran" proc"dur"#
4Nij"4 do%ra politika pisati svaku op"raciju iz poc"tka i to %as
tamo gd" vam j" zatr"%ala# (o n" samo da uv"cava kood, n"go i pov"cava
mogucnost da dodj" do gr"sk"# Osim toga, cilj mod"rnih programskih
j"zika j" u tom" da t"kst programa sto v"rnij" odslikava strukturu
pro%l"ma# /ko j" potr"%no u j"dnom tr"nutku uraditi n"ku vratolomiju
sa matricama, id"alno %i %ilo da s" moz" napisati n"sto ovako8
I 8? $nv(/ 4 (ranspos"(& 6 D"t(N 4 /dj(-
N"sto n"poz"ljnij", ali jos uv"k prihvatljivo j" ovakvo parc" kooda8
$nv(/, /0H
(ranspos"(&, &0H
MatMul(/0, &0, PH
/dj(-, -0H
ScalMul(D"t(N, OH
Mat/dd(P, O, IH
No, najruzniji, najlosiji i najn"prihvatljiviji nacin j" onaj koji
pocinj" ovako8
9or i 8? 0 to n do
9or j 8? 0 to n do
(4 rutina koja inv"rtuj" matricu / u /0 4H
9or i 8? 0 to n do
9or j 8? 0 to n do
&0Fi,jG 8? &Fj, iGH
9or i 8? 0 to n do
9or j 8? 0 to n do
(4 rutina koja mnozi /0 i &0 4H
(4 itd 4
O ovom posl"dnj"m n" tr"%a ni pricati# Ono drugo moz" u svakom
programskom j"ziku (osim starih 4pravih4 &/S$I-a, a ono prvo
samo u n"kim j"zicima# $zm"dju ostalih, i u OO j"zicima#
'asno j" da j" to izrazajna moc koju z"limoJ
!koliko n"mat" mogucnost da koristit" OO j"zik, koristit" %ar id"j"#
Badit" kao sto j" d"monstrirano u drugom prim"ru# (ako c" vasi
programi %iti razumljiviji, laks" c" s" t"stirati, i programiranj"
c" t"ci mnogo prirodnij"#
2lava P#
3 ! kojoj s" vidi sta j" to programiranj" na j"dnom vis"m nivou
3 apstrakcij", i koja s" zavrsava mantrom za ovu Sagu#
Opsta m"todologija programiranja koja s" moz" okarakt"risati kao
4dooo%ra4 m"todologija s" ukratko moz" opisati ovako8 tr"%a
dizajnirati odgovarajuc" struktur" podataka, napisati proc"dur"
za manipulaciju tim strukturama podataka, i kada dodj" do kljucnog
tr"nutka, samo s" pozivaju gotov" proc"dur" koj" rad" posao#
(ako dolazimo do j"dnog vis"g nivoa apstrakcij" u programima# !
tr"nutku kada j" potr"%no prim"niti n"k" op"racij" na n"kim
strukturama, n" int"r"suj" nas 4kako4 proc"dur" rad", v"c 4sta4
rad"#
Prim"r# Pr"tpostavimo da imamo tip M/(B$- i pak"t proc"dura koj"
%arataju sa matricama# Qada kaz"mo8
var a, % 8 M/(B$-H
%"gin
N"RMatri.(aH N"RMatri.(%H
B"adMatri.(aH
(ranspos"(a, %H
Srit"Matri.(%H
Dispos"Matri.(aH Dispos"Matri.(%
"ndH
mi z"limo da posao %ud" o%avlj"nJ !opst" nas n" int"r"suj" da li
su matric" impl"m"ntiran" kao
tDp" M/(B$- ? arraD F0 ## Ma.-, 0 ## Ma.NG o9 r"alH
ili su impl"m"ntiran" pr"ko pokazivackih struktura
tDp" M/(B$- ? LMatri.AntrDH
Matri.AntrD ? r"cord
i, j 8 int"g"rH
"ntrD 8 r"alH
right, doRn 8 M/(B$-
"ndH
(sto moz" %iti jako zgodno kada s" radi sa r"tkim matricama#
Qako su moguc" razn" impl"m"ntacij" koj" rad" isti posao, to
u tr"nutku upotr"%" proc"dura nij" %itna unutrasnja struktura,
v"c 4ponasanj"4 proc"dura (koj" j" dato u sp"ci9ikaciji pak"ta#
N$'A &$(N/ $MPTAMAN(/I$'/, VAI M/N$FAS(/I$'A (('# OSO&$NA OPAB/I$'/
D/(O2 ($P/ POD/(/Q/#
2lava )#
3 ! kojoj s" javlja pojam apstraktnog tipa podataka# (ako smo jos
3 j"dan korak %liz" pojmu OO# Qonv"rg"ncija j" spora, ali n"umitna#
Vid"li kako struktura podataka sna%d"v"na odgovarajucim op"racijama
postaj" tip podataka#
/pstraktni tip podataka j" tip podataka ciju impl"m"ntaciju n"
znamo (prim"r8 n" znamo da li su matric" pr"dstavlj"n" sa arraD ili
pr"ko pokazivaca, ali znamo kako s" ponasaju op"racij" nad
vr"dnostima tog tipa, tako da pis"mo program korist"ci samo oso%in"
op"racija#
'asno j" zasto s" to zov" tip podataka (zato sto j" to upravo tip
podataka# / dodat mu j" atri%ut CCapstraktniEE zato sto korisnik
n" poznaj" konkr"tnu impl"m"ntaciju# Qorisniku su poznata samo
apstraktna svojstva op"racija nad tim tipom (drugim r"cima, poznato j"
sta koja op"racija radi, ali n" i kako to radi# Dakl", apstrahovana
j" j"dna dim"nzija pro%l"ma8 impl"m"ntacija tipa#
(N&8 apstrahovati znaci iz%aciti iz posmatranja ono sto u tom tr"nutku
nij" %itno#
/pstraktni tip podataka c"mo oznacavati sa /D( (/%stract Data (Dp"#
2lava *#
3 Dva prim"ra
--------------------------------------------------------------------
Prim"r 08 St"k sa c"lo%rojnim "l"m"ntima kao apstraktni tip podataka
--------------------------------------------------------------------
(4 SPAI$F$Q/I$'/ 4
(ip8 StackO9$nt
Op"n(s - inicijalizuj" st"k sH mora s" pozvati pr" prv"
upotr"%" prom"nljiv" s
Ilos"(s - d"inicijalizuj" st"k sH mora s" pozvati kada s vis"
nij" potr"%na i vis" s" n"c" koristiti
Push(s, n, ok - na st"k s stavi %roj n i vrati ok ? tru"H ako to
nij" moguc", vrati ok ? 9als"
Pop(s, n, ok - sa st"ka s skin" %roj n i vrati ok ? tru"H ako to
nij" moguc", vrati ok ? 9als"
Full(s - vrati tru" akko na s vis" n"ma m"sta
AmptD(s - vrati tru" akko j" s prazan
(4 $MPTAMAN(/I$'/ 4
tDp" StackO9$nt ? LStackAntrDH
StackAntrD ? r"cord
"ntrD 8 int"g"rH
link 8 StackO9$nt
"ndH
proc"dur" Op"n(var s 8 StackO9$ntH
%"gin
s 8? nil
"nd (4 Op"n 4H
proc"dur" Ilos"(var s 8 StackO9$ntH
var
t 8 StackO9$ntH
%"gin
Rhil" s @U nil do %"gin
t 8? sH
s 8? sL#linkH
dispos"(t
"nd
"nd (4 Ilos" 4H
proc"dur" Push(var s 8 StackO9$ntH n 8 int"g"rH var OQ 8 &ool"anH
var
t 8 StackO9$ntH
%"gin
n"R(tH
i9 t ? nil th"n
OQ 8? 9als"
"ls" %"gin
tL#"ntrD 8? nH
tL#link 8? sH
s 8? tH
OQ 8? tru"
"nd
"nd (4 Push 4H
proc"dur" Pop(var s 8 StackO9$ntH var n 8 int"g"rH var OQ 8 &ool"anH
var
t 8 StackO9$ntH
%"gin
i9 s ? nil th"n
OQ 8? 9als"
"ls" %"gin
t 8? sH
s 8? sL#linkH
n 8? tL#"ntrDH
OQ 8? tru"H
dispos"(t
"nd
"nd (4 Pop 4H
9unction Full(s 8 StackO9$nt 8 &ool"anH
%"gin
Full 8? 9als"
(4
4 ovd" moz" da id" i poziv n"k" sist"msk" rutin" koja c"
4 prov"riti da li ima dovoljno m"sta za alokaciju
4
"nd (4 Full 4H
9unction AmptD(s 8 StackO9$nt 8 &ool"anH
%"gin
AmptD 8? s ? nil
"nd (4 AmptD 4H
--------------------------------------------------------------------
Prim"r =8 St"k sa c"lo%rojnim "l"m"ntima kao apstraktni tip podataka
--------------------------------------------------------------------
(4 SPAI$F$Q/I$'/ 4
(ip8 StackO9$nt
Op"n(s - inicijalizuj" st"k sH mora s" pozvati pr" prv"
upotr"%" prom"nljiv" s
Ilos"(s - d"inicijalizuj" st"k sH mora s" pozvati kada s vis"
nij" potr"%na i vis" s" n"c" koristiti
Push(s, n, ok - na st"k s stavi %roj n i vrati ok ? tru"H ako to
nij" moguc", vrati ok ? 9als"
Pop(s, n, ok - sa st"ka s skin" %roj n i vrati ok ? tru"H ako to
nij" moguc", vrati ok ? 9als"
Full(s - vrati tru" akko na s vis" n"ma m"sta
AmptD(s - vrati tru" akko j" s prazan
(4 $MPTAMAN(/I$'/ 4
const Ma.Stack ? 0,,H
tDp" StackO9$nt ? r"cord
top 8 int"g"rH
"ntrD 8 arraD F0 ## Ma.StackG o9 int"g"r
"ndH
proc"dur" Op"n(var s 8 StackO9$ntH
%"gin
s#top 8? ,
"nd (4 Op"n 4H
proc"dur" Ilos"(var s 8 StackO9$ntH
%"gin
s#top 8? ,
"nd (4 Ilos" 4H
proc"dur" Push(var s 8 StackO9$ntH n 8 int"g"rH var OQ 8 &ool"anH
%"gin
i9 s#top ? Ma.Stack th"n
OQ 8? 9als"
"ls" %"gin
s#top 8? s#top 6 0H
s#"ntrDFs#topG 8? nH
OQ 8? tru"
"nd
"nd (4 Push 4H
proc"dur" Pop(var s 8 StackO9$ntH var n 8 int"g"rH var OQ 8 &ool"anH
%"gin
i9 s#top ? , th"n
OQ 8? 9als"
"ls" %"gin
n 8? s#"ntrDFs#topGH
s#top 8? s#top - 0
"nd
"nd (4 Pop 4H
9unction Full(s 8 StackO9$nt 8 &ool"anH
%"gin
Full 8? s#top ? Ma.Stack
"nd (4 Full 4H
9unction AmptD(s 8 StackO9$nt 8 &ool"anH
%"gin
AmptD 8? s#top ? ,
"nd (4 AmptD 4H
2lava +#
3 Qoja opravdava pr"thodnu glavu i u kojoj s" javlja j"dna cudna
3 r"c -- izomor9izam
Qoja j" razlika izm"dju prim"ra 0 i =5 ! impl"m"ntaciji tipa#
Qorisnik n" vidi nikakvu razlikuJ /ko korisnik ima sp"ci9ikaciju
(ip8 StackO9$nt
Op"n(s - inicijalizuj" st"k sH mora s" pozvati pr" prv"
upotr"%" prom"nljiv" s
Ilos"(s - d"inicijalizuj" st"k sH mora s" pozvati kada s vis"
nij" potr"%na i vis" s" n"c" koristiti
Push(s, n, ok - na st"k s stavi %roj n i vrati ok ? tru"H ako to
nij" moguc", vrati ok ? 9als"
Pop(s, n, ok - sa st"ka s skin" %roj n i vrati ok ? tru"H ako to
nij" moguc", vrati ok ? 9als"
Full(s - vrati tru" akko na s vis" n"ma m"sta
AmptD(s - vrati tru" akko j" s prazan
potpuno mu j" n"%itno sta s" d"sava iza toga# Nj"gov program koji
koristi st"k c" raditi savrs"no %"z o%zira na konkr"tn" proc"dur" koj"
rad" u pozadini# Stavis", ako j" prvo koristio pak"t iz prim"ra 0,
a onda %io primoran da koristi pak"t iz prim"ra =, nj"gov program
s" n"c" prom"niti ni za linijuJJJ
(ajna moci /D( l"zi u tom" da su svi apstraktni tipovi koji imaju istu
sp"ci9ikaciju izomor9ni (u alg"%arskom smislu# Naim", sp"ci9ikacija
s" moz" opisati id"ntit"tima (tj# j"dnacinama, a svaki tip
(tj# alg"%arska struktura koja zadovoljava t" id"ntit"t" j" izomor9an
sa svakim drugim takvim tipom#
$d"ja iza izomor9izama j" upravo nasa mantra8 izomor9n" struktur"
u sustini pr"dstavljaju j"dnu istu stvar# Bazlika j" j"dino u nacinu
r"alizacij" t" j"dn" stvariJ
2lava 1#
3 Qoja kazuj" zasto j" do%ro raditi sa /D(
!potr"%a /D( ima n"koliko pr"dnosti nad o%icnim (jako konkr"tnim
programiranj"m#
Prvo, program"r n" mora da razmislja o impl"m"ntaciji j"dn" stvari
dok impl"m"ntira drugu# (ako su nj"govi mozdani talasi 9okusirani
samo na j"dno# $mpl"m"ntaciju pomocnih o%j"kata slo%odno moz" da
za%oravi i da ih koristi znajuci samo njihov" apstraktn" oso%in"#
Drugo, na taj nacin s" j"dnostavnij" radi timski# Svaki clan tima
do%ij" posao da impl"m"ntira j"dan /D(# On to uradi, spakuj" u
modul i distri%uira ostalima u timu samo sp"ci9ikaciju svog /D(#
/ko s" ostali u timu strogo pridrzavaju sp"ci9ikacij", impl"m"ntator
garantuj" da c" to da radi# (akodj", ostali n" moraju da s"
opt"r"cuju d"taljima o impl"m"ntaciji tudj"g /D(, j"r imaju
i svog posla pr"ko glav"#
(r"c", kada onaj ko j" impl"m"ntirao /D( nadj" %olj" i %rz"
algoritm" da uradi svoj posao, slo%odno moz" da m"nja kood po svom
modulu, da dot"ruj" i u%rzava, sv" dotl" dok n" m"nja sp"ci9ikaciju#
$zm"n" koj" on vrsi uopst" n" uticu na ostal" u timu (j"dino mogu
%iti prijatno izn"nadj"ni kada vid" da njihov program odj"dar"d radi
%rz" H
2lava 0,#
3 ! kojoj s" vidi kako s" /D( l"po slaz" sa modularnom strukturom
3 j"zika i zasto j" do%ro sakrivati pon"stoH takodj", ovo j" kraj
3 s"gm"nta o /D(#
/D( s" jako l"po slaz" sa modularnom strukturom j"zika# !glavnom
s" j"dan /D( impl"m"ntira kao j"dan modul# D"9inicioni d"o s"
razd"li pot"ncijalnim korisnicima kao sp"ci9ikacija tipa, a
u impl"m"ntacionom s" tip r"alizuj"#
A9ikasna upotr"%a apstraktnih tipova podataka s" %azira na korisc"nju
sp"ci9ikacij", %"z vir"nja u impl"m"ntaciju tipa# /ko korisnik makar
malko cacn" po impl"m"ntaciji, c"la id"ja propada#
Praksa j" pokazala da kaogod sto j" d"cu n"moguc" odvici od cackanja
nosa, tako j" program"r" n"moguc" odvici od cackanja po
impl"m"ntaciji tipa# !v"k s" nadj" n"ki mracni kutak sv"sti iz koga
iskoci id"ja8
/ zasto %ih ja ovu trivijalnu stvar radio pozivom proc"dur"
(i tako gu%io vr"m", kada j" mnogo %rz" r"ci
a#structF.GL#l"9t 8? nilH Sada cu ja to caskom, da niko n" vidi#
:ato j" za pojam /D( n"raskidivo v"zan pojam sakrivanja in9ormacij"
(in9ormation hiding# Program"ru s" da im" tipa i pak"t proc"dura#
$mpl"m"ntacija tipa s" S/QB$'A da j" on n" vidi# Iak i ako poz"li
da c"prka po strukturi, j"zik tr"%a to da mu za%rani# Modula-=
ima dir"ktnu podrsku za impl"m"ntiranj" /D(# M"hanizam s" zov"
OpaVu" (Dp"s# Avo prim"ra st"ka na Moduli-= koji j" impl"m"ntiran
kao /D(8
DAF$N$($ON MOD!TA StackO9$ntH
(NPA S(/IQH
(4 uocit" kako j" impl"m"ntacija 49izicki4 sakriv"na od
4 korisnika /D(H Qorisnik do%ija samo #DAF datot"ku, pa da
4 ga vidim hoc" li usp"ti da c"prka po mojim st"kovima,
4 ili c" da programira kEo sav normalan sv"tJ HG 4
PBOIAD!BA Op"n(V/B s 8 S(/IQH
PBOIAD!BA Ilos"(V/B s 8 S(/IQH
PBOIAD!BA Push(V/B s 8 S(/IQH n 8 $N(A2ABH V/B OQ 8 &OOTA/NH
PBOIAD!BA Pop(V/B s 8 S(/IQH V/B n 8 $N(A2ABH V/B OQ 8 &OOTA/NH
PBOIAD!BA Full(s 8 S(/IQ 8 &OOTA/NH
PBOIAD!BA AmptD(s 8 S(/IQ 8 &OOTA/NH
AND (4 DAF$N$($ON 4 StackO9$nt#
(ip s" u potpunost d"9inis" u impl"m"ntacionom modulu, koji, po
pr"tpostavci, nij" dostupan korisniku (a i da j"st", komapjl"r c"
mu za%raniti da uradi %ilo sta sa prom"nljivom tipa S(/IQ, osim
da pozov" n"ku od nav"d"nih proc"dura#
2lava 00#
3 Mali r"zim" i odgovor na pitanj" zasto smo s" toliko tim" %avili u
3 prici o OOP
Do sada smo vid"li sta j" tip podataka, sta j" struktura podataka
i kako s" od struktur" napravi tip#
Vid"li smo kako iz toga narast" id"ja /D( i dv" osnovn" stvari koj"
s" v"zuju za /D(8
0# apstrahovanj" (data a%straction
=# skrivanj" podataka (in9ormation hiding
(akodj" j" napom"nuto da s" /D( jako l"po slaz" sa modularnim j"zicima#
(o n" znaci da id"j" /D( n" moz"t" koristiti na n"kom j"ziku koji
n"ma m"hanizam modula i n"ma m"hanizam za skrivanj" (npr, Pascal#
Pri radu sa takvim j"zicima tr"%a da pokaz"t" vis" samodisciplin"#
$d"ja /D( j" %"skonacno vazna# (o j" 4osnovna4 id"ja OOP# Sv" ostalo
o c"mu c"mo pricati j" vazno, ali j" manj" apstraktno#
2lava 0=#
3 ! kojoj pocinj" ispucavanj" OO 9olklora8 o%j"kti i m"todi#
O%j"kt j" pak"t podataka koji ima svoj tajni zivot# Moz"t" ga
zamisliti kao j"dnu skupinu surovih podataka i proc"dura kojoj
j" nad"nuto im" (to sto skupina ima im" j" jako vaznoJ#
Proc"dur" koj" su d"o o%j"kta s" zovu m"todi (to su m"todi za m"njanj"
stanja o%j"kta, dok surovi podaci opisuju (t"kuc" stanj" o%j"kta#
Na prim"r, opis o%j"kta u n"kom ps"udoj"ziku moz" da izgl"da ovako8
var matri. 8
o%j"ct
"ntrD 8 arraD o9 arraD o9 r"alH
m, n 8 cardinalH
m"thods
init(p, V 8 cardinal is
%"gin
n"R("ntrD, p, VH
m 8? pH
n 8? V
"nd initH
9r""( is
%"gin
dispos"("ntrD, m, nH
m 8? ,H
n 8? ,
"nd 9r""H
r"ad( is
i, j 8 cardinalH
%"gin
i9 null("ntrD th"n
ABBOB(W!ninitialis"d matri.W
"ls"
9or i 8? 0 to m do
9or j 8? 0 to n do
B"adB"al("ntrDFi, jG
"nd "nd
"nd "nd r"adH
Rrit"( is
(4 slicno kao r"ad 4
"nd Rrit"
"nd o%j"ctH
Ovaj o%j"kt pr"dstavlja j"dnu matricu koja moz" da uradi c"tiri
stvari8 da s" inicijalizuj", da s" samou%ij", da s" ucita i da s"
ispis"#
2lava 0<#
3 Poruk" i m"todi
Poruka j" n"sto kao poziv proc"dur" (za on" koji su ucili logiku8
poruka j" t"rmJ# Ona n"ma znac"nj" dok s" n" uputi n"kom o%j"ktu#
(o j" samo niz znakova#
Qada s" o%j"ktu uputi poruka, on m"dju svojim m"todima potrazi onaj
koji ima isto im" i signaturu (signatura j" struktura argum"nata
kao sto s" zaht"va u poruci# /ko n" usp", o%j"kt od%aci poruku
(i tako izazov" gr"sku, ili n"sto slicno#
/ko o%j"kt usp" da nadj" odgovarajuci m"tod m"dju m"todima kojima
raspolaz", prim"ni taj m"tod na s"%i, sto moz" da dov"d" do prom"n"
stanja o%j"kta (izm"n" s" vr"dnosti n"kih prom"nljivih i do upucivanja
novih poruka novim o%j"ktima# (!putiti poruku o%j"ktu znaci (u t"rminima
logik" pokusati int"rpr"tirati odgovarajuci t"rm#
O%j"kt kom" s" upucuj" poruka zov" s" primalac (r"c"iv"r, sto j"
dosta logicno#
Na prim"r, ako imamo o%j"kt matri. kao u pr"thodnom prim"ru8
var matri. 8
o%j"ct
"ntrD 8 arraD o9 arraD o9 r"alH
m, n 8 cardinalH
m"thods
init(p, V 8 cardinal is %"gin ### "nd initH
9r""( is %"gin ### "nd 9r""H
r"ad( is ### %"gin ### "nd r"adH
Rrit"( is ### %"gin ### "nd Rrit"
"nd o%j"ctH
tada
matri.#init(1, 0,
pr"dstavlja poruku init(1, 0, upuc"nu o%j"ktu matri.# Qako o%j"kt
pos"duj" m"tod koji s" zov" init i prima dva argum"nta tipa cardinal,
to c" o%j"kt int"rpr"tirati poruku na odgovarajuci nacin, tj#
aktivirac" m"tod init sa argum"ntima 1 i 0,# /ktivacija m"toda init
c" dov"sti do prom"n" stanja o%j"kta8 %ic" alociran prostor za
"l"m"nt" matric" i %ic" popunj"n" vr"dnosti za m i n#
2lava 0M#
3 Polimor9izam
Bazliciti o%j"kti mogu imati m"tod" sa istim im"nom# /ko uputimo
poruku j"dnom o%j"ktu, on c" j" int"rpr"tirati korist"ci svoj" m"tod"#
No, tu istu poruku drugi o%j"kt moz" int"rpr"tirati na sasvim drugi
nacin, j"r c" on koristiti svoj" m"tod" (m"todi s" zovu isto,
ali rad" sasvim drugacij" stvari#
Ova oso%ina s" zov" polimor9izam#
Prim"r8 posmatrajmo o%j"kt" (ra9icTight (koji mod"luj" s"ma9or, i
Prim"2"n (koji j" g"n"rator prostih %roj"va8
var (ra9icTight 8
o%j"ct
light 8 (r"d, r"d-D"lloR, D"lloR, gr""nH
m"thods
init( is
%"gin
light 8? r"d
"nd initH
n".t( is
%"gin
cas" light o9
7 r"d 8 light 8? r"d-D"lloRH
7 r"d-D"lloR 8 light 8? gr""nH
7 D"lloR 8 light 8? r"dH
7 gr""n 8 light 8? D"lloR
"nd
"nd n".tH
Rrit"( is
%"gin
cas" light o9
7 r"d 8 Srit"Str(Wr"dWH
7 r"d-D"lloR 8 Srit"Str(Wr"d X D"lloRWH
7 D"lloR 8 Srit"Str(WD"lloRWH
7 gr""n 8 Srit"Str(Wgr""nW
"nd
"nd Rrit"
"nd o%j"ctH
var Prim"2"n 8
o%j"ct
p 8 cardinalH
m"thods
init( is
%"gin
p 8? <
"nd initH
n".t( is
%"gin
r"p"at
p 8? p 6 =
until Prim"(p
"nd n".tH
Rrit"( is
%"gin
Srit"Iard(p
"nd Rrit"
"nd o%j"ctH
!ocimo da o%a o%j"kta imaju tri m"toda8 init, n".t, Rrit"# Qada kaz"mo
(ra9icTight#initH Prim"2"n#initH
j"dnu istu poruku smo uputili i j"dnom i drugom o%j"ktu# Bazlika j" u
tom" sto c" poruka init u prvom pozivu aktivirati m"tod init
o%j"kta (ra9icTight, dok c" poruka init u drugom pozivu aktivirati
m"tod init o%j"kta Prim"2"n# :ato, nakon
(ra9icTight#initH
(ra9icTight#n".tH
(ra9icTight#n".tH
(ra9icTight#n".tH
(ra9icTight#Rrit"H
do%ijamo string WD"lloRW na "kranu, dok nakon
Prim"2"n#initH
Prim"2"n#n".tH
Prim"2"n#n".tH
Prim"2"n#n".tH
Prim"2"n#Rrit"H
do%ijamo %roj 00 na "kranu# Ova dva o%j"kta su na ist" poruk" r"agovali
razlicito, j"r su ih int"rpr"tirali svako na svoj nacin# '"dna ista
poruka upuc"na razlicitim o%j"ktima dovodi do razlicitog ponasanja#
2lava 0P#
3 Qoja govori o j"dnom sinonimu -U "ncapsulation
Svaki o%j"kt koji drzi do s"%" mora svoju unutrasnjost drzati
dal"ko od prljavih prstiju okolnih korisnika (ili, klij"nata#
:ato onaj d"o o%j"kta koji opisuj" strukturu prom"nljivih koj"
cuvaju stanj" o%j"kta n" sm" %iti dostupan klij"ntima#
/ko n"ko z"li da prov"ri iYili da prom"ni stanj" o%j"kta, mora to
to uciniti upucivanj"m poruk" o%j"ktu# Na taj nacin o%j"kt ima
potpunu kontrolu nad samim so%om i moz" da stiti svoj int"grit"t
(u krajnj"m slucaju, m"tod koji prov"ravaYm"nja stanj" o%j"kta moz"
na n"ki nacin prov"riti ko j" poslao poruku i, ukoliko posiljalac
nij" klij"nt od pov"r"nja, moz" od%iti da otkrij"Yizm"ni svoj"
stanj"#
(o j" u skladu sa opstom id"jom o skrivanju podataka
(in9ormation hiding i zov" s" jos i "ncapsulation (ucaur"nost#
Podaci su ucaur"ni u o%j"ktu i do njih s" n" moz" doci lako#
2lava 0)#
3 ! kojoj s" izgradi najj"dnostavniji o%j"ktni mod"l ---
3 --- programiranj" %azirano na o%j"ktima (o%j"ct-%as"d programming
Qada imamo programski j"zik koji podrzava o%j"kt" (kao n"zavisn"
"ntit"t", ucaur"nost, m"hanizam poruka i polimor9izam, do%ijamo
najj"dnostavniji o%lik o%j"ktnog programiranja8 programiranj"
%azirano na o%j"ktima (o%j"ct-%as"d programming#
! n"kim slucaj"vima to j" sasvim prihvatljiv mod"l# Najpopularnija
v"rzija o%j"ct-%as"d mod"la j" actor mod"l (o%j"kti s" zovu CCglumciEE
FactorsG, a m"todi kojima su naoruzani su njihov t"kst FscriptGH
programski j"zik koji impl"m"ntira ovu id"ju s" zov" /ct=#
2lava 0*#
3 Qoja o%jasnjava pojam klas" i pojam instanc" klas"
Qao sto smo vid"li u mod"lu %aziranom na o%j"ktima (o%j"ct-%as"d mod"l,
svaki o%j"kt za s"%" d"9inis" sopstv"no ponasanj"# Qada o%j"kata
ist" vrst" ima mnogo, to znaci da mnogo puta tr"n%a uraditi j"dnu istu
stvar# :ato s" uvodi pojam klas"# Qlasa s" moz" shvatiti kao opis
j"dn" vrst" o%j"kata# Qlasa opisuj" zaj"dnicko ponasanj" svih
o%j"kata koji pripadaju toj klasi#
O%j"kti koji pripadaju n"koj klasi zovu s" instanc" t" klas"#
Qlasa opisuj" koja polja i koj" m"tod" c" imati instanc" t" klas"#
!m"sto da za svaki o%j"kt pos"%no opisuj"mo strukturu polja i m"toda,
to opis"mo u klasi, pa onda samo kaz"mo da j" o%j"kt O instanca
klas"# Pr"vodilac na osnovu toga zna kako izgl"da struktura o%j"kta#
2lava 0+#
3 ! kojoj s" daj" kompl"tan prim"r j"dn" klas"
PB$MAB8 klasa koja opisuj" r"aln" matric"
class B"alMatri.
".port init, dim0, dim=, r"ad, Rrit", at, put,
mulScal, add, su%, mulH
(4
4 ovo su im"na m"toda koji cin" sp"ci9ikaciju ponasanja
4 instanci klas"
4
instanc" varia%l"s
"ntrD 8 arraD o9 arraD o9 r"alH
m, n 8 cardinalH
instanc" m"thods
(4
4 inicijalizuj" o%j"kt tako sto postavi 9ormat matric" i
4 aliocira prostor
4
init(p, V 8 cardinal is
%"gin
n"R("ntrD, p, VH m 8? pH n 8? V
"nd initH
(4 prva i druga dim"nzija matric" 4
dim0( 8 cardinal is
%"gin
r"turn m
"nd dim0H
dim=( 8 cardinal is
%"gin
r"turn n
"nd dim=H
(4 ucitavanj" i ispis matric" 4
r"ad( is
i, j 8 cardinalH
%"gin
i9 null("ntrD th"n ABBOB(W!ninitialis"d matri.W
"ls"
9or i 8? 0 to m do
9or j 8? 0 to n do
B"adB"al("ntrDFi, jG
"nd "nd
"nd "nd r"adH
Rrit"( is
i, j 8 cardinalH
%"gin
i9 null("ntrD th"n ABBOB(W!ninitialis"d matri.W
"ls"
9or i 8? 0 to m do
9or j 8? 0 to n do
Srit"B"al("ntrDFi, jG
"nd "nd
"nd "nd Rrit"H
(4
4 vrati "l"m"nt matric" koji s" nalazi na datoj koordinati
4
at(p, V 8 cardinal 8 r"al is
%"gin
i9(0 ?@ p ?@ m and (0 ?@ V ?@ n th"n r"turn "ntrDFp, VG
"ls" ABBOB(W$nvalid ind".W
"nd "nd atH
(4
4 na datu koordinatu u matrici stavi datu vr"dnost
4
put(p, V 8 cardinalH val 8 r"al is
%"gin
i9(0 ?@ p ?@ m and (0 ?@ V ?@ n th"n "ntrDFp, VG 8? val
"ls" ABBOB(W$nvalid ind".W
"nd "nd putH
(4
4 mnoz"nj" matric" datim %roj"m
4
mulScal(. 8 r"al 8 B"alMatri. is
i, j 8 cardinalH
r"s 8 B"alMatri.H
%"gin
r"s#init(m, nH
9or i 8? 0 to m do
9or j 8? i to n do
r"s#put(i, j, . 4 "ntrDFi,jG
"nd "ndH
r"turn r"s
"nd mulScalH
(4 z%ir i razlika dv" matric" 4
add(V 8 B"alMatri. 8 B"alMatri. is
i, j 8 cardinalH
r"s 8 B"alMatri.H
%"gin
i9 (m ? V#dim0 and (n ? V#dim= th"n
r"s#init(m, nH
9or i 8? 0 to m do
9or j 8? 0 to n do
r"s#put(i, j, "ntrDFi, jG 6 V#at(i, j
"nd "ndH
r"turn r"s
"ls" ABBOB(W/tt"mpt to add incompati%l" matric"sW
"nd "nd addH
su%(V 8 B"alMatri. 8 B"alMatri. is
i, j 8 cardinalH
r"s 8 B"alMatri.H
%"gin
i9 (m ? V#dim0 and (n ? V#dim= th"n
r"s#init(m, nH
9or i 8? 0 to m do
9or j 8? 0 to n do
r"s#put(i, j, "ntrDFi, jG - V#at(i, j
"nd "ndH
r"turn r"s
"ls" ABBOB(W/tt"mpt to add incompati%l" matric"sW
"nd "nd su%H
(4
4 proizvod dv" matric" (r"c"iv"r 4 V
4
mul(V 8 B"alMatri. 8 B"alMatri. is
r"s 8 B"alMatri.H
r 8 r"alH
i, j, k 8 cardinalH
%"gin
i9 n ? V#dim0 th"n
r"s#init(m, V#dim=H
9or i 8? 0 to m do
9or j 8? 0 to V#dim= do
r 8? ,H
9or k 8? 0 to n do
r 8? r 6 "ntrDFi, kG 4 V#at(k, j
"nd "ndH
"ndH
r"s#put(i, j, r
"ls"
"nd
"nd mulH
r"turn r"s
ABBOB(W/tt"mpt to multiplD incompati%l" matric"sW
"nd B"alMatri.#
2lava 01#
3 Prim"r o%j"kata koji pripadaju klasi B"alMatri.
Posmatrajmo klasu B"alMatri. iz pr"thodnog prim"ra# Nakon d"klaracija8
var a 8 B"alMatri.H
var % 8 B"alMatri.H
CCaEE i CC%EE su instanc" klas" B"alMatri.# (o znaci da o%a imaju
polja CC"ntrDEE, CCmEE, i CCnEE (koja su privatna stvar i imaju
m"tod" init, dim0, dim=, r"ad, Rrit", at, put, mulScal, add, su%, mul#
Avo i prim"ra upotr"%" o%j"kata CCaEE i CC%EE8
%"gin
a#init(0,, 0,H a#r"adH
% 8? a#mul(aH (4 tj# % 8? a 4 a 4
a 8? %#mulScal(=#,H (4 tj# a 8? = 4 % 4
###
Srit"B"al(a#at(<,<H (4 ispis" aF<,<G 4
###
"nd#
2lava =,#
3 Qoja prica o jos n"kim stvarima koj" mogu da rad" klas"8
3 class m"thods X class varia%l"s
Qlasa opisuj" strukturu i ponasanj" svojih instanci# No, ima programskih
j"zika u kojima i klasa moz" imati svoj privatni zivot# Drugim r"cima,
i klasa moz" imati svoj" prom"nljiv" i svoj" m"tod"#
Prom"nljiv" koj" pripadaju klasi (class varia%l"s sluz" za to da
klasa drzi n"k" svoj" in9ormacij" (r"cimo, koliko instanci t"
klas" j" do sada napravlj"no, #### (" in9ormacij" nisu nikom"
dostupn" dir"ktno# On" s" mogu korisititYm"njati iskljucivo
put"m poruka upuc"nih klasi# Poruk" upuc"n" klasi s" int"rpr"tiraju
na isti nacin kao poruk" upuc"n" o%j"ktu# '"dina razlika j" u tom"
sto poruk" upuc"n" klasi traz" m"tod" iz skupa privatnih m"toda
klas" (class m"thods#
Smalltalk, r"cimo, ima malo drugaciji pristup# (u su prom"nljiv" koj"
pripadaju klasi u stvari glo%aln" prom"nljiv" koj" korist" instanc"
t" klas" i to za m"djuso%nu komunikaciju# Prom"nljiv" koj" pripadaju
klasi u Smalltalk-u su dostupn" samo instancama t" klas" i m"todima
klas"#
'os uv"k n" postoji opst"prihvac"no mislj"nj" da li klasa tr"%a da
ima pravo na intimni zivot ili n"H da li moz" da ima svoju
privatnost, ili tr"%a samo da sluzi svojim instancama#
M"ni s" cini da j" do%ro kada i klas" imaju svoju intimu#
2lava =0#
3 ! kojoj s" izgradjuj" novi st"p"nik u hij"rarhiji o%j"ktnih
3 mod"la --- programiranj" %azirano na klasama (class-%as"d
3 programming
/ko n"ki programski j"zik podrzava klas", o%j"kt" kao instanc" klasa
(dakl", n" mogu s" opisati o%j"kti sami za s"%", v"c s" opisuju
klas", a o%j"kti s" javljaju kao instanc" klasa, ucaur"nost,
m"hanizam poruka i polimor9izam, do%ijamo novi mod"l o%j"ktnog
programiranja8 programiranj" %azirano na klasama (class-%as"d
programming#
N"strpljivog citaoca o%av"stavamo da c" Saga v"c u nar"dnom pak"tu
poruka potpuno iskonv"rgirati ka o%j"ktno-orij"ntisanom mod"lu# $skr"no
s" nadamo da n"strplj"nj" nij" zgasnulo zar u srcima s poc"tka#
2lava ==#
3 ! kojoj s" vidi kako M= podrzava o%j"ct-%as"d programiranj"
3 (dodus", sa malim zakasnj"nj"m
'"dna od l"pota M= j" to sto M= podrzava o%j"ct-%as"d programiranj"#
$d"ja j" da s" o%j"kti impl"m"ntiraju kao %i%liot"cki moduli8
za svaki o%j"kt po j"dan %i%liot"cki modul#
! d"9inicionom d"lu s" nalazi pak"t proc"dura koj" opisuju ponasanj"
o%j"kta (m"todi, a u impl"m"ntacionom d"lu s" impl"m"ntiraju struktura
o%j"kta i m"todi (koji su nav"d"ni u d"9inicionom d"lu#
Na prim"r, o%j"kt koji opisuj" stampac moz" da %ud" impl"m"ntiran
u M= ovako8
DAF$N$($ON MOD!TA Print"rH
FBOM FontSupport $MPOB( FontH
FBOM 2raphicsSupport $MPOB( 2raphicsH
(NPA FontKandl" ? I/BD$N/TH
(NPA MODA ? (dra9tMod", lVMod", graphMod", mD9ontMod"H
PBOIAD!BA Op"n(H
PBOIAD!BA Ilos"(H
PBOIAD!BA S"tMod"(o(mod" 8 MODAH
PBOIAD!BA (hisMod"( 8 MODAH
PBOIAD!BA Print(".t(t".t 8 /BB/N OF IK/BH
PBOIAD!BA Print2raphics(graph 8 2raphicsH
PBOIAD!BA N"RTin"(H
PBOIAD!BA Tin"F""d(H
PBOIAD!BA FormF""d(H
PBOIAD!BA Status( 8 $N(A2ABH
PBOIAD!BA DoRnloadFont(9ont 8 Font 8 FontKandl"H
PBOIAD!BA S"l"ctFont(handl" 8 FontKandl"H
AND Print"r#
Nj"ga koristimo u drugim modulima ovako8
$MPOB( Print"rH
pa kada kaz"mo
Print"r#Op"nH
Print"r#Print(".t(WK"llo, SorldJWH
Print"r#FormF""dH
Print"r#Ilos"H
to moz"mo shvatiti kao CCproc"duralnoEE programiranj" (tj# kao niz
poziva proc"dura, ali i kao CCo%j"ktnoEE programiranj" (o%j"ktu
Print"r j" upuc"no n"koliko poruka na koj" c" on ad"kvatno r"agovati#
!ocimo da su svi "l"m"nti o%j"ktno-%aziranog programiranja podrzani
(apstrakcija, ucaur"nost, podrzka o%j"ktima kao n"zavisnim "ntit"tima#
2lava =<#
3 Qoja sadrzi jos j"dnu pricu ispricanu sa zakasnj"nj"m8
3 :asto dva %ajta nisu uv"k dva %ajta
3 (sto j" tr"%alo %iti ispricano nakon glav" o /D(
Mnogi inz"nj"ri (pa i n"ki nasi stud"nti, a narocito I program"ri,
smatraju da su dva %ajta uv"k dva %ajta# Na taj nacin oni uopst"
n" razlikuju (do na "psilon tipov", r"cimo, $N(A2AB i /BB/N F, ## 0G OF
IK/B# Njima j" to isto8 dva %ajta#
DV/ &/'(/ N$S! !VAQ DV/ &/'(/J Oni s" razlikuju po tom" koja im j"
uloga dod"lj"naJ Dva %ajta r"z"rvisana za n"ki $N(A2AB imaju sasvim
drugaciju ulogu od dva %ajta r"z"rvisana za n"ki /BB/N F, ## 0G OF
IK/B# :ato su oni %"skonacno razliciti i niposto ih n" sm"mo
m"sati#
/nalogija iz zivota %i, pri%lizno, isla ovako8 skola i %olnica
mogu imati istu zapr"minu (kao zgrad", ali to niposto n" znaci da
j" to j"dno t" istoJ Bazlikuju s" po 9unkcijiJ
2lava =M#
3 ! kojoj Saga pocinj" malko da lici na pravu sapunsku op"ru, j"r
3 c"mo poc"ti da pricamo o nasl"djivanju# Sr"cna okolnost j" to
3 sto u Sagi niko n" mora da umr" kako %i moglo da dodj" do
3 nasl"djivanja#
Osnovna odlika o%j"ktno-orij"ntisanih sist"ma j" nasl"djivanj"#
Da s" n" %ismo upustali u v"liko 9ilozo9iranj" i puno zvucnih 9raza,
"vo prvo j"dnog prim"ra# Posmatrajmo klasu B"alMatri. (od ranij"8
class B"alMatri.
".port init, dim0, dim=, r"ad, Rrit", at, put,
mulScal, add, su%, mulH
instanc" varia%l"s
"ntrD 8 arraD o9 arraD o9 r"alH
m, n 8 cardinalH
instanc" m"thods
init(p, V 8 cardinal is ###H
dim0( 8 cardinal is ###H
dim=( 8 cardinal is ###H
r"ad( is ###H
Rrit"( is ###H
at(p, V 8 cardinal 8 r"al is ###H
put(p, V 8 cardinalH val 8 r"al is ###H
mulScal(. 8 r"al 8 B"alMatri. is ###H
add(V 8 B"alMatri. 8 B"alMatri. is ###H
su%(V 8 B"alMatri. 8 B"alMatri. is ###H
mul(V 8 B"alMatri. 8 B"alMatri. is ###H
"nd B"alMatri.#
:"l"li %ismo da naravimo klasu SVuar"B"alMatri. koja c" pr"dstavljati
kvadratn" r"aln" matric"#
'"dan nacin j" da uzm"mo klasu B"alMatri. i da j" malo pr"radimo# Na
taj nacin do%ijamo dv" klas" kod kojih j" 1,3 kooda id"nticno# 2u%imo
vr"m" i m"sto na disku#
:ar n" %i %ilo l"po kada %ismo mogli da kaz"mo da j" klasa
SVuar"B"alMatri. do na "psilon j"dnaka sa klasom B"alMatri., pa da
dopis"mo samo razliku5
O, da# N" samo da %i %ilo l"po, n"go j" to i moguc"J M"hanizam koji
nam to omogucuj" zov" s" nasl"djivanj"# Napravic"mo z"lj"nu klasu
i, um"sto da pr"kucavamo kood iz klas" B"alMatri., r"ci c"mo da
j" nova klasa podklasa klas" B"alMatri.# (ada c" ona nasl"diti sv"
oso%in" klas" B"alMatri., a mi c"mo samo dopisati nov" (sp"ci9icn"
m"tod" i r"d"9inisati n"k" star"# B"cimo, ovako8
class SVuar"B"alMatri.
inh"rits B"alMatri.H
(4 ova d"klaracija znaci da klasa SVar"B"alaMatri. nasl"djuj"
4 sv" oso%in" klas" B"alMatri. 4
".port init, d"t, invH
(4 sv" m"tod" koj" j" klasa B"alMatri. nudila okruz"nju nova
4 klasa nudi po automatizmuH j"dino sto nova klasa jos tr"%a
4 da izv"z" su novi m"todi CCd"tEE i CCinvEE, i r"d"9inisani
4 m"tod CCinitEE 4
(4 nova klasa pr"uzima impl"m"ntaciju od star" klas" i,
4 ukoliko j" to potr"%no, dodaj" n"k" sp"ci9icn"# ! ovom slucaju,
4 n"ma potr"%" da s" dodaju nov" prom"nljiv" 4
instanc" m"thods
init(p 8 cardinal is
%"gin
s"l9#Linit(p, p
"nd initH
(4 klasa SVuar"B"alMatri. ima novu proc"duru za inicijali-
4 zaciju koja j" karakt"risticna za nju# Ona radi tako
4 sto o%j"ktu koji j" primio poruku init(p posalj"
4 m"tod init(p, p iz nadklas"# (s"l9 j" prom"nljiva u
4 koju s" sm"sti primalac poruk"H poruka o%lika
4 o#Lm(a znaci da o%j"ktu o tr"%a uputiti poruku m(a,
4 ali impl"m"ntaciju potraziti t"k u nj"govoj nadklasi#
4 Na ovaj nacin smo u podklasi r"d"9inisali proc"duru
4 iz nadklas" 4
d"t( 8 r"al is
%"gin
(4 proc"dura koja racuna d"t"rminantu matric" 4
"nd d"tH
inv( 8 SVuar"B"alMatri. is
%"gin
(4 proc"dura koja inv"rtuj" matricu 4
"nd invH
"nd SVuar"B"alMatri.#
2lava =P#
3 'os o nasl"djivanju, kao i j"dan popularan t"rmin8 cod" r"us"
Nasl"djivanj" j" r"lacija m"dju klasama# Ono omogucuj" da s"
d"9inicija i impl"m"ntacija j"dn" klas" %azira na d"9iniciji
i impl"m"ntaciji n"k" v"c postoj"c" klas"# Na taj ncin s"
st"di vr"m", novac, ali i m"sto na disku#
Prilikom nasl"djivanja podklasa nasl"djuj" i m"tod" i strukturu
o%j"kta od svoj" nadklas"# Iinj"nica da podklasa nasl"djuj" m"tod"
znaci da njih n" tr"%a pisati ponovo# (r"%a dopisati samo nov"
stvari, kao i on" koj" s" razlikuju# Ova oso%ina s" zov" CCcod"
r"us"EE (j"r podklasa koristi kood iz nadklas"#
Pri nasl"djivanju, situacija iz nadklas" moz" malo da s" izm"ni,
tako da moz"mo razlikovati tri CCtradicionaln"EE upotr"%" nasl"djivanja8
o Sp"cijalizacija# (o j" situacija u kojoj podklasa doda
n"k" nov" instanc" varia%l"s i "v"ntualno jos n"k" m"tod"#
Prim"r8
class Plan"Figur"
instanc" varia%l"s
c"nt"r-, c"nt"rN 8 cardinalH
nam" 8 stringH
colour 8 IoloursH
instanc" m"thods
s"tI"nt"r(., D 8 cardinal is ###H
s"tNam"(n"RNam" 8 string is ###H
s"tIolour(n"RIolour 8 Iolours is ###H
mov"(d., dD 8 cardinal is ###H
"nd Plan"Figur"#
class Iircl"
inh"rits Plan"Figur"H
instanc" varia%l"s
radius 8 cardinalH
instanc" m"thods
draR( is ###H
Rip"( is ###H
"nd Iircl"#
Qlasa Iircl" j" iz klas" Plan"Figur" nasl"dila strukturu o%j"kta
(tj# prom"nljiv" c"nt"r-, c"nt"rN, nam", colour i sv" m"tod",
i tom" jos dodala prom"nljivu radius i dva nova m"toda# !ocimo
da klasa Iircl" nista nij" m"njala od onoga sto j" nasl"dila#
o Prosir"nj" 9unkcionalnosti klas"# (o j" situacija u kojoj
podklasa n" dodaj" nov" instanc" varia%l"s, v"c samo doda
nov" m"tod"# Prim"r8
class M"nu
instanc" varia%l"s
m"nu&ar 8 list o9 Su%M"nuH
instanc" m"thods
cr"at"( is ###H
r"mov"( is ###H
displaD( is ###H
cl"ar( is ###H
g"tS"ll"ction( 8 cardinal is ###H
"nd M"nu#
class S"irdM"nu
inh"rits M"nu
instanc" m"thods
displaDAv"rD(millis"conds 8 longcard is ###H
displaDBandomlD( is ###H
r"9us"S"ll"ction( 8 cardinal is ###H
monk"DSith!s"r( is ###H
"nd S"irdM"nu#
o Modi9ikacija# (o j" situacija u kojoj podklasa r"d"9inis"
n"k" (ili sv" m"tod" koj" j" nasl"dila iz nadklas"# Prim"r
smo vid"li kod klas" SVuar"B"alMatri. gd" j" mnogo m"toda
pr"uz"to iz nadklas", ali j" j"dan (m"tod init r"d"9inisan#
2lava =)#
3 Vrst" nasl"djivanja
Nasl"djivanj" moz" %iti j"dnostruko i vis"struko# '"dnostruko
nasl"djivanj" j" ono kod koga klasa moz" da nasl"di oso%in"
najvis" j"dn" klas"# Qod vis"strukog nasl"djivanja klasa
moz" da nasl"di oso%in" n"koliko klasa#
Prim"ri koj" smo do sada vid"li su %azirani na mod"lu j"dnostrukog
nasl"djivanja# Prim"r" vis"strukog nasl"djivanja c"mo vid"ti
malo kasnij"# Bazlog za to j" r"lativna sloz"nost mod"la sa
vis"strukim nasl"djivanj"m# $ma dosta t"hnikalija koj" tr"%a
pom"nuti da %i s" do%ila potpuna slika#
'os uv"k s" vodi diskusija o tom" da li j" dovoljno da programski
j"zik podrzava j"dnostruko nasl"djivanj", ili j" mnogo %olj" da
podrzava vis"struko# $ j"dan i drugi mod"l imaju i pr"dnosti i
man"#
2lava =*#
3 ! kojoj s" klas" ur"djuju u hij"rarhiju i u kojoj s" uvodi
3 j"dna oznaka#
Qao sto smo pom"nuli, nasl"djivanj" j" r"lacija m"dju klasama#
Ona ur"djuj" klas" u sta%lo (u sist"mima sa j"dnostrukim nasl"djivanj"mH
kod sist"ma sa vis"strukim nasl"djivanj"m, do%ija s" aciklican
digra9, dakl", hij"rarhijsku strukturu#
/ko j" klasa I0 podklasa klas" I,, onda c"mo to oznaciti
sa I, U I0, ili I0 @ I,# Podklasa moz" %iti dir"ktna ili indir"ktna#
N"zavisno od toga koristimo oznaku CC@EE# Na prim"r, ako j"
I @ I= @ I0 @ I, niz klasa koj" su j"dna drugoj dir"ktn" podklas",
slo%odno moz"mo r"ci da j" I @ I, j"r j" I doista podklasa od I,,
mada n" dir"ktna#
2lava =+#
3 ! kojoj s" prica o tom" kako s" tumaci poruka upuc"na o%j"ktu
3 u OO sist"mima sa j"dnostrukim nasl"djivanj"m#
N"ka j" - instanca klas" I i n"ka j" I @ I= @ I0 @ I,# /ko o%j"ktu
- uputimo poruku m(a8
-#m(a
potr"%no j" naci impl"m"ntaciju odgovarajuc"g m"toda# Prvo s" pr"gl"da
klasa I# /ko u njoj postoji m"tod sa im"nom CCmEE, onda s" poruka
m(a protumaci kao poziv m"toda CCmEE iz klas" I#
No, ako u klasi I n" postoji m"tod sa im"nom CCmEE, o%j"kt n"c"
od%aciti poruku, v"c c" prov"riti da li u n"koj od nadklasa postoji
odgovarajuci m"tod# Potraga za m"todom s" nastavlja u nj"govoj
nadklasi (to j", u ovom prim"ru, klasa I=# /ko u klasi I= postoji
m"tod koji s" zov" CCmEE, onda j" sv" OQ# Poruka -#m(a s" protumaci
kao prim"na m"toda CCmEE iz klas" I= na o%j"kt -#
! suprotnom s" prov"rava da li u klasi I0 postoji m"tod CCmEE, itd###
Potraga s" nastavlja sv" dok s" n" pronadj" odgovarajuci m"tod, ili
dok n" stign"mo do vrha hij"rarhij"# /ko nigd" n"ma z"lj"nog nam
m"toda, on s" od%acuj" (uz odgovarajuc" posl"dic"#
2lava =1#
3 'os j"dan pomodan t"rmin8 assignm"nt compati%ilitD
'"dna od l"pih (ali i zap"tljanijih stvari v"zanih za nasl"djivanj"
j" da s" prom"nljivoj koja j" d"klarisana kao prom"nljiva klas"
I0 moz" dod"liti o%j"kt %ilo koj" klas" I= za koju j" I= @ I0#
Na prim"r, ako imamo da j"
var a 8 Plan"Figur"H (4 vid"ti r"thodn" poruk" 4
var % 8 Iircl"H
var m 8 B"alMatri.H
onda j" dod"la
a 8? %
ispravna, j"r j" Iircl" podklasa klas" Plan"Figur", dok dod"la
a 8? m
nij" ispravna, j"r B"alMatri. nij" podklasa klas" Plan"Figur"#
Ovo s" strucno kaz" da j" Iircl" CCassignm"nt compati%l"EE sa
Plan"Figur", ali da B"alMatri. to nij"# (akodj", kaz"mo da j"
CC%EE CCassignm"nt compati%l"EE sa CCaEE, ali da CCmEE to nij"#
2lava <,#
3 Qoja j" malko surova j"r opisuj" kako s" m"todi v"zuju# Sr"com,
3 to ih n" %oli# Odgovarajuci pomodni t"rmin j" dinamicko
3 v"zivanj" (dDnamic %inding# / pricac"mo i o statickom v"zivanju#
Qada imamo prom"nljivu koja j" d"klarisana kao prom"nljiva klas" I0,
njoj moz"mo dod"liti o%j"kt %ilo koj" klas" I= za koju j" I= @ I0#
(o ima int"r"santn" posl"dic" na tumac"nj" poruk" koja j" upuc"na
prom"nljivoj klas" I0#
(umac"nj" poruka s" jos zov" i CCv"zvanj" m"todaEE j"r s" odgovarajuci
m"tod CCv"z"EE za poruku (%inding# Dinamicko v"zivanj" m"toda
znaci da s" m"todi v"zuju za poruk" u toku izvrsavanja programa,
a n" u toku kompilacij"# Bazlog j" krajnj" j"dnostavan8 u toku
kompilacij" niko ziv n" zna kojoj klasi c" pripadati o%j"kt kom" s"
upucuj" poruka# :ato s" nikada n" zna odakl" tr"%a poc"ti potragu
za onim pravim m"todom#
Avo prim"ra# N"ka j" data klasa Plan"Figur" (kao ranij" i nj"n"
podklas" Iircl", B"ctagl", (riangl"8
class Plan"Figur"
instanc" varia%l"s
c"nt"r-, c"nt"rN 8 cardinalH
nam" 8 stringH
colour 8 IoloursH
instanc" m"thods
s"tI"nt"r(., D 8 cardinal is ###H
s"tNam"(n"RNam" 8 string is ###H
s"tIolour(n"RIolour 8 Iolours is ###H
mov"(d., dD 8 cardinal is ###H
"nd Plan"Figur"#
class Iircl"
inh"rits Plan"Figur"H
instanc" varia%l"s
radius 8 cardinalH
instanc" m"thods
draR( is ###H
Rip"( is ###H
"nd Iircl"#
class B"ctangl"
inh"rits Plan"Figur"H
instanc" varia%l"s
Ridth, h"ight 8 cardinalH
instanc" m"thods
draR( is ###H
Rip"( is ###H
"nd B"ctangl"#
class (riangl"
inh"rits Plan"Figur"H
instanc" varia%l"s
sid"0, sid"=, sid"< 8 cardinalH
instanc" m"thods
draR( is ###H
Rip"( is ###H
"nd (riangl"#
Posmatrajmo ovakv" d"klaracij"8
var p9 8 Plan"Figur"H
var c 8 Iircl"H
var r 8 B"ctangl"H
var t 8 (riangl"H
Pr"tpostavimo da smo inicijalizovali prom"nljiv" CCcEE, CCrEE i CCtEE#
Sada j" CCcEE n"ki krug, CCrEE j" n"ki pravougaonik, a CCtEE j" n"ki
trougao# /ko kaz"mo
c#draR
jasno j" da c" %iti pozvan m"tod CCdraREE iz klas" Iircl"# No sta s"
d"sava ako kaz"mo
p9 8? cH
p9#draRH 5
$d"ja dinamickog v"zivanja j" u tom" da run-tim" sist"m prov"ri
sta s" nalazi u prom"nljivoj CCp9EE# (ada, kada sazna kojoj podklasi
klas" Plan"Figur" pripada sadrzaj prom"nljiv" CCp9EE, pocinj"
da trazi m"tod u odgovarajucoj klasi# Dakl", nakon pr"thodn"
s"kv"nc" op"t c" %iti aktiviran m"tod CCdraREE iz klas" Iircl"#
Slicno, nar"dna s"kv"nca poziva m"tod" CCdraREE iz sv" tri podklas"
klas" Plan"Figur", r"dom8
p9 8? cH p9#draRH (4 pozov" m"tod iz klas" Iircl" 4
p9 8? rH p9#draRH (4 pozov" m"tod iz klas" B"ctangl" 4
p9 8? tH p9#draRH (4 pozov" m"tod iz klas" (riangl" 4
'asno j" da s" u toku kompilacij" nikako n" moz" odr"diti sta c"
%iti sadrzaj prom"nljiv" CCp9EE, pa tako do samog kraja ostaj"
n"izv"sno u kojoj klasi tr"%a poc"ti potragu za m"todom CCdraREE#
S drug" stran", sist"m koji podrzava staticko v"zivanj" %i j"dnostavno
potrazio m"tod CCdraREE u klasi Plan"Figur"# Qako tamo n"ma m"toda
sa im"nom CCdraREE i kako Plan"Figur" n"ma nadklasu, sist"m sa statickim
v"zivanj"m %i (n"opravdano prijavio gr"sku#
2lava <0#
3 ! kojoj s" daj" prim"r za dinamicko v"zivanj" m"toda8
3 h"t"rog"ni nizovi
Dinamicko v"zivanj" j" jako zgodna stvar# Sada c"mo
d"monstrirati j"dnu int"r"santnu prim"nu# Pozmatrajmo niz
ravanskih 9igura8
var 9ig 8 arraD F0 ## Ma.G o9 Plan"Figur"H
var N 8 cardinalH (4 %roj 9igura u nizu 4
Prica o assignm"nt compati%ilitD nam daj" da "l"m"nt niza CC9igEE
moz" %iti o%j"kt %ilo koj" od klasa8 Iircl", B"ctangl", (riangl"#
Pr"tpostavimo da smo na n"ki nacin popunili "l"m"nt" niza CC9igEE
raznim krugovima, pravougaonicima iYili trouglovima# (o s", na
prim"r, moz" uciniti ovako8
N 8? ,H
r"p"at inc(NH
ShichFigur"(oB"ad(kindH
cas" kind o9
7 r"ct 8 B"adB"ctangl"(9igFNGH
7 circ 8 B"adIircl"(9igFNGH
7 tri 8 B"ad(riangl"(9igFNGH
"ls"
"nd
P/N$I
until NoMor"D"sir"(oAnt"rFigur"sH
/ko tr"%a iscrtati svih N 9igura, ovo j" naj"l"gantniji nacin da s"
to ucini8
9or i 8? 0 to N do
9igFiG#draR
"ndH
:%og pric" o dinamickom v"zivanju, run-tim" sist"m prvo prov"ri
sta s" nalazi u prom"nljivoj 9igFiG, pa onda odluci od koj" klas"
da pocn" pr"trazivanj"# Na taj nacin c" za svaku 9iguru %iti
pozvan m"tod CCdraREE %as iz nj"n" klas" (na trouglov" c" %iti
prim"nj"n m"tod CCdraREE iz klas" (riangl", na krugov" m"tod iz klas"
Iircl", a na pravougaonik" m"tod iz klas" B"ctangl"#
/ko tr"%a pom"riti c"lu konst"laciju 9igura za v"ktor (D-, DN, to s"
moz" uciniti ovako8
9or i 8? 0 to N do
9igFiG#mov"(D-, DN
"ndH
!ocimo da j" CCmov"EE m"tod iz klas" Plan"Figur"# On nij" impl"m"ntiran
ni u j"dnoj od podklasa koj" koristimo, ali nasl"djivanj" o%"z%"djuj"
da on ipak %ud" pronadj"n i prim"nj"n kako tr"%a# !ocimo da s" i u ovom
slucaju prim"njuj" dinamicko v"zivanj" m"todaJ Drugim r"cima, t"k
run-tim" sist"m odr"djuj" tumac"nj" poruk" CCmov"(D-, DNEE#
Bazlog j" krajnj" j"dnostavan8 u toku kompilacij" n" moz"mo %iti
sigurni da m"tod CCmov"EE nij" r"d"9inisan u n"koj od podklasaJ
! ovom prim"ru m"tod CCmov"EE nij" %io r"d"9inisan ni u j"dnoj podklasi,
pa j" pozvan onaj zaj"dnicki iz klas" Plan"Figur"#
Da smo kojim slucaj"m, r"cimo, u klasi B"ctangl" r"d"9inisali m"tod
CCmov"EE, na sv" pravougaonik" u listi %i %io prim"nj"n njihov m"tod
CCmov"EE, dok %i na ostal" %io prim"nj"n zaj"dnicki m"tod CCmov"EE
(tj# onaj iz klas" Plan"Figur"#
2lava <=#
3 Ato, jos ni stota poruka, a v"c c"mo d"9inisati pojam
3 o%j"ktno-orij"ntisanog programirnja HG
/ko n"ki programski j"zik podrzava klas", o%j"kt" kao instanc" klasa
(dakl", n" mogu s" opisati o%j"kti sami za s"%", v"c s" opisuju
klas", a o%j"kti s" javljaju kao instanc" klasa, ucaur"nost,
nasl"djivanj", m"hanizam poruka, polimor9izam i dinamicko v"zivanj",
to j" o%j"ktno-orij"ntisani j"zikJ
Nasl"djivanj" moz" %iti i j"dnostruko i vis"struko# (o n" utic"
na o%j"ktnu orij"ntisanost j"zika# Vazno j" da j"zik podrzava n"ki
mod"l nasl"djivanja#
(akodj", n"ki o%j"ktni j"zici podrzavaju j"dino staticko v"zivanj"
m"toda# (o n" znaci da oni nisu o%j"ktni j"zici, v"c samo da imaju
manju izrazajnu moc#
Ovim j" zavrs"n osnovni d"o Sag" o OO j"zicima i varij"t"tima cija
j" nam"na %ila da ustanovi d"9inicij"# ! nastavku Sag" c" s" govoriti
o n"kim napr"dnim t"hnikama koj" j"su %itn" za OO, ali nisu ono sto
d"9inis" OO# Stvari o kojima c"mo govoriti uglavnom spadaju u
t"hnik" impl"m"ntacij" OO j"zika, ili su posl"dica impl"m"ntacij"#
Saga o OOP, Drugi d"o 8 $mpl"m"ntacij"
Dragan Masulovic
(u sklopu Vannastavnih aktivnosti iz programiranja, PMF-Novi Sad
!vod
Prvi d"o Sag" j" uv"o osnovn" pojmov" OOP i d"monstrirao ih na
prim"rima# Sada c"mo malo pricati o t"hnikama impl"m"ntacij"
OO programskih j"zika i svim dos"tkama i zackoljicama koj" j"
potr"%no imati da %i s" od id"j" moglo pr"ci na n"sto sto
j" upotr"%ljivo# (u spadaju konstruktori i d"struktori,
g"n"rick" klas", virtu"lni m"todi ### Dakl", sv" ono o c"mu
ljudi glasno govor" kada z"l" da s" spontano procuj" u drustvu
da su oni magovi OOP-a#
(r"%a sv" vr"m" imati na umu da ono o c"mu c" %iti r"ci u ovom d"lu
Sag" Znij"ZonoZstoZkarakt"ris"ZOOPZ, v"c j" samo posl"dica
odluka u dizajniranju OO j"zika i impl"m"ntacij" njihovih pr"vodilaca#
Pri kraju Sag" c"mo r"ci i n"koliko r"ci o vis"strukom
nasl"djivanju, nj"govim pr"dnostima i pro%l"mima koji s" javljaju
prilikom nj"gov" impl"m"ntacij"#
2lava 0#
3 ! kojoj s" vidi da s" %"z mnogih stvari moz"
N"ki OO j"zici s" pr"vod", a n"ki s" int"rpr"tiraju# N"ki podrzavaju
strong tDping i imaju staticku prov"ru tipova, a n"ki su tzv#
tDp"l"ss j"zici, tj# j"zici kod kojih s" prov"ra tipova vrsi u
toku izvrs"nja programa (run-tim"#
Sv" t"hnik" o kojima c"mo govoriti u ovoj tacki su karakt"risticn"
za j"zik" koji imaju staticku prov"ru tipova i koji s" pr"vod"#
OO j"zici koji su tDp"l"ss i int"rpr"tiraju s" n"maju potr"%u za
tolikim i takvim komplikacijama# Ovim s" samo jos j"dnom potvrdjuj"
da prica koja sl"di Znij"ZonoZstoZkarakt"ris"ZOOPZ, v"c j"
samo posl"dica impl"m"ntacij" pr"vodilaca za strong-tDp"d OO j"zik"#
(o n" znaci da su tDp"l"ss OO j"zici koji s" int"rpr"tiraju
CCmanj" OOEE# Oni su u istoj m"ri o%j"ktno orij"ntisani, s tom razlikom
da mnogo vis" prov"ra ostavljaju run-tim" sist"mu# (im" s" do%ija
"l"gantniji j"zik, ali s" malo gu%i na "9ikasnosti#
2lava =#
3 Pro%l"m sa sm"stanj"m o%j"kata
Posmatrajmo klasu Plan"Figur", poznatu nam jos iz prvog d"la Sag"8
class Plan"Figur"H
".port s"tI"nt"r, s"tNam", s"tIolour, mov"H
instanc" varia%l"s
c"nt"r-, c"nt"rN 8 cardinalH
nam" 8 stringH
colour 8 IoloursH
instanc" m"thods
s"tI"nt"r(., D 8 cardinal is ###H
s"tNam"(n"RNam" 8 string is ###H
s"tIolour(n"RIolour 8 Iolours is ###H
mov"(d., dD 8 cardinal is ###H
"nd Plan"Figur"#
/ko pr"tpostavimo da j" tip cardinal v"lik = %ajta, tip string
v"lik =P) %ajta i tip Iolours v"lik jos = %ajta, za pamc"nj"
instanc" klas" Plan"Figur" nam j" potr"%no =)= %ajta#
Posmatrajmo jos i klasu Iircl", koja j" podklasa klas" Plan"Figur"8
class Iircl"H
inh"rits Plan"Figur"H
".port draR, Rip"H
instanc" varia%l"s
radius 8 cardinalH
instanc" m"thods
draR( is ###H
Rip"( is ###H
"nd Iircl"#
Ona od klas" Plan"Figur" nasl"djuj" sv" instanc" varia%l"s, i dodaj"
jos j"dnu -U radius# :ato j" za pamc"nj" instanc" klas" Iircl"
potr"%no =)= 6 = ? =)M %ajta#
N"ka s" n"gd" u programu javlja ovakva d"klaracija8
var p9 8 Plan"Figur"H
B"cit", koliko %ajtova tr"%a alocirati za prom"nljivu p95 Da li =)=
(zato sto j" to osnovna v"licina ili =)M (zato sto prica o
assignm"nt compati%ilitD daj" da s" prom"nljivoj p9 uv"k moz"
dod"liti prom"nljiva tipa Iircl"5 / sta ako n"gd" u %uducnosti
napravimo podklasu klas" Plan"Figur" cija instanca zaht"va
0=,0= %ajtova za sm"stanj"5 Da li odmah tr"%a alocirati
najv"ci moguci prostor, pa n"ka zvrji prazan ako ga n" upotr"%imo5
2lava <#
3 B"s"nj" pro%l"ma8 r"9"r"nc" s"mantics
Skoro svi OO programski j"zici ovu dil"mu razr"s" na najj"dnostavniji
moguci nacin8 instanca klas" s" tr"tira kao pokazivac na n"sto#
:ato c" d"klaracija
var p9 8 Plan"Figur"H
nav"sti pr"vodilac da za prom"nljivu p9 alocira samo M %ajta
(koliko j", r"cimo, potr"%no za pokazivac, dok s" ono pravo,
tj# ono na sta p9 pokazuj", alocira naknadno, u toku rada
programa#
Na ovaj nacin s" o%"z%"djuj" uni9ormnost pri dod"ljivanju8 kada
s" prom"nljivoj p9 dod"ljuj" instanca klas" Iircl", r"cimo, tada
s" pr"%acuju samo pokazivaci, cija v"licina j" prilicno konstantna
na 9iksiranoj plat9ormi#
:a ovakav pogl"d na o%j"ktivnu r"alnost kaz" s" da impl"m"ntira
r"9"r"nc" s"mantics# $ma n"kih j"zika u kojima s" to pokusava
sr"diti na drugi nacin, ali s" stvari prilicno zap"tljaju#
Svi popularni j"zici korist" r"9"r"nc" s"mantics# /ko j" j"zik
jos i do%ro dizajniran, to s" uopst" n" vidi, ili s" t"k
naslucuj"#
2lava M#
3 Pro%l"mi sa r"s"nj"m pro%l"maH i odmah r"s"nj"8 konstruktori,
3 d"struktori i kloniranj"
Postoji j"dna od posl"dica Mar9ij"vog zakona (&"ckhapov zakon
koja kaz" da j"
l"pota 4 pam"t ? const#
:ato jako pam"tno r"s"nj" uglavnom nij" i jako l"po# (o vazi i za
r"9"r"nc" s"mantics8 mada r"sava j"dan pro%l"m, r"9"r"nc" s"mantics
sa so%om donosi nov"#
Prvi v"liki pro%l"m j" u tom" da pr"vodilac alocira samo pokazivac
na o%j"kt# (o znaci da s" prostor za sadrzaj mora alocirati naknadnoJ
(ako dolazimo do pojma konstruktora# Qonstruktor j" n"sto (proc"dura,
m"tod, sp"cijalna oznaka ili slicno sto alocira prostor za instancu
dat" klas"# On s" mora pozivati "ksplicitno#
Na prim"r, u Smalltalk-u su konstruktori r"alizovani kao m"todi klas"#
Svaka klasa ima class m"thod n"R koji alocira prostor za instancu#
Na prim"r, ako u prom"nljivu c z"limo da sm"stimo instancu klas"
Iircl", to radimo tako sto klasi Iircl" uputimo poruku n"R# Ona napravi
novu instancu i vrati pokazivac8
7 c 7
###
c 8? Iircl" n"R#
! I66 s" to radi pozivom pos"%nog m"toda (koji ima isto im" kao i klasa,
pa tako znamo da j" to konstruktor#
! O%"ronu(= s" to radi pozivom standardn" proc"dur" NAS8
V/B c 8 Iircl"#$nstanc"H
###
NAS(cH
a u Ai99"l-u korist"ci sp"cijalnu sintaksnu konstrukciju ("v"ntualno uz
n"ku inicijalizacionu poruku8
. 8 SOMA(K$N2H
D 8 SOMA(K$N2ZATSAH
JJ.H
JJD#cr"at"Proc"dur"(###H
Druga vrsta pro%l"ma su d"struktori# D"struktor sluzi da pocisti
dju%r", tj# instanc" koj" su odsluzil" svojoj svrsi, pa m"moriju
koju su zapr"mal" tr"%a oslo%oditi i r"ciklirati# ! najv"c"m %roju
kulturnih OO j"zika r"cikliranj" radi run-tim" sist"m (u o%liku
gar%ag" coll"ctor-a# (ako rad" Smalltalk, O%"ron(=, Ai99"l i mnogi
drugi# No, I66 zaht"va da s" i d"struktori pozivaju "ksplicitno#
Dakl", u I66 program"r n" samo da mora da %rin" o kr"iranju
o%j"kata, v"c i o njihovom unistavanju#
(r"ca vrsta pro%l"ma j" dod"ljivanj"# /ko su c i d prom"nljiv",
on" sadrz" pokazivac" na sadrzaj o%j"kta, pa dod"la
c 8? dH
samo pr"%aci pokazivac# :ato s" kod svih OO j"zika koji r"alizuju
r"9"r"nc" s"mantics (a to su skoro svi OO j"zici mora voditi
racuna o dva nivoa dod"l"8
(o pr"%acivanj" pokazivaca
(o pravlj"nj" kopij" o%j"kta
Dod"la o%lika c 8? d u skoro svim j"zicima pr"dstavlja samo pr"%acivanj"
pokazivaca# Pravlj"nj" kopij" o%j"kta s" mora "ksplicitno zaht"vati#
Npr, u Smalltalku tom" sluz" m"todi shalloRIopD i d""pIopD,
u Ai99"lu tom" sluz" m"todi copD i clon", dok u O%"ronu(= i I66-u
program"r mora sam da pis" m"tod" koji prav" kopiju o%j"kta#
2lava P#
3 Pro%l"m sa upucivanj"m poruka
Skoro svi mod"rni OO j"zici koji s" pr"vod" su dizajnirani tako da
podrzavaju strong tDping i staticku prov"ru tipova#
(o znaci da s" prov"r" tipova vrs" u toku kompilacij"#
S j"dn" stran", to j" do%ro zato sto s" jos u ranim 9azama otkrivaju
mnogi %ugovi# S drug" stran", staticka prov"ra tipova s" malko
posvadja sa dinamickim v"zivanj"m m"toda# Avo prim"ra#
Posmatrajmo ponovo klasu Plan"Figur"8
class Plan"Figur"H
".port s"tI"nt"r, s"tNam", s"tIolour, mov"H
instanc" varia%l"s
c"nt"r-, c"nt"rN 8 cardinalH
nam" 8 stringH
colour 8 IoloursH
instanc" m"thods
s"tI"nt"r(., D 8 cardinal is ###H
s"tNam"(n"RNam" 8 string is ###H
s"tIolour(n"RIolour 8 Iolours is ###H
mov"(d., dD 8 cardinal is ###H
"nd Plan"Figur"#
i nj"n" podklas" Iircl", B"ctagl", (riangl"8
class Iircl"H
inh"rits Plan"Figur"H
".port draR, Rip"H
instanc" varia%l"s
radius 8 cardinalH
instanc" m"thods
draR( is ###H
Rip"( is ###H
"nd Iircl"#
class B"ctangl"H
inh"rits Plan"Figur"H
".port draR, Rip"H
instanc" varia%l"s
Ridth, h"ight 8 cardinalH
instanc" m"thods
draR( is ###H
Rip"( is ###H
"nd B"ctangl"#
class (riangl"H
inh"rits Plan"Figur"H
".port draR, Rip"H
instanc" varia%l"s
sid"0, sid"=, sid"< 8 cardinalH
instanc" m"thods
draR( is ###H
Rip"( is ###H
"nd (riangl"#
!zmimo jos da j" 9ig niz ravanskih 9igura d"klarisan ovako8
var 9ig 8 arraD F0 ## Ma.NG o9 Plan"Figur"H
i da su u 9igF0G do 9igFNG n"kako sm"st"ni razni krugovi,
pravougaonici i trouglovi# V"c smo konstatovali da j" naj"l"gantniji
nacin da s" iscrta svih N 9igura ovaj8
9or i 8? 0 to N do
9igFiG#draR
"ndH
No, to su nas" z"lj"# Pogl"dajmo kako s" pr"vodilac ponasa kada
pocn" da pr"vodi ov" tri linij"# 9or j" OQ, tu n"ma sta da s"
9ilozo9ira (pod pr"tpostavkom da su i i N prom"nljiv" d"klarisan" na
odgovarajuci nacin# Pr"vodilac pocinj" da pr"vodi
drugu liniju# Pogl"da prom"nljivu 9igFiG, prim"ti da j" ona instanca
klas" Plan"Figur" i da joj s" upucuj" poruka draR# Pr"vodilac
%i sada z"l"o da o%avi tDp" ch"cking, pa razgl"da malo po d"9iniciji
klas" Plan"Figur"# No, tamo n"ma m"toda koji %i odgovarao poruci
draRJ Iompilation "rror#
Dakl", strong tDping i staticka prov"ra tipova nam kvar" z"lj"#
$zgl"da da s" staticka prov"ra tipova i dinamicko v"zivanj" m"toda
n" trp"# / z%og l"pot" o%" id"j" z"limo da zadrzimo i j"dno i drugo#
Sta c"mo sad5
2lava )#
3 B"s"nj" pro%l"ma8 virtu"lni m"todi
B"s"nj" pro%l"ma j" dos"tka koja s" zov" virtu"lni m"todi# Qlasu
Plan"Figur" c"mo d"9inisati ovako8
class Plan"Figur"H
".port s"tI"nt"r, s"tNam", s"tIolour, mov", draR, Rip"H
instanc" varia%l"s
c"nt"r-, c"nt"rN 8 cardinalH
nam" 8 stringH
colour 8 IoloursH
instanc" m"thods
s"tI"nt"r(., D 8 cardinal is ### %"gin ### "nd s"tI"ntr"rH
s"tNam"(n"RNam" 8 string is ### %"gin ### "nd s"tNam"H
s"tIolour(n"RIolour 8 Iolours is ### %"gin ### "nd s"tIolourH
mov"(d., dD 8 cardinal is ### %"gin ### "nd mov"H
draR( is virtualH
Rip"( is virtualH
"nd Plan"Figur"#
D"klaracija virtual pr"dstavlja o%"canj" pr"vodiocu# Ona znaci da
c" m"todi draR i Rip" %iti d"9inisani n"gd" u n"koj podklasi, ali
da c"mo s" na njih pozivati pr" n"go sto %udu impl"m"ntirani#
virtual j" n"sto slicno sa 9orRard u Pascalu# Qao sto 9orRard
znaci da c" odgovarajuc proc"dura %iti d"9inisana kasnij", ali
da j" moramo koristiti pr" n"go sto %ud" d"9inisana, tako i virtual
o%"cava pr"vodiocu da c"mo odgovarajuci m"tod d"9inisati n"gd"
u podklasi klas", ali da ipak moramo da ga koristimo pr" toga#
/ko j" klasa Plan"Figur" d"9inisana na ovaj nacin, pr"vodj"nj"
do sada pro%l"maticnog parc"ta kooda
9or i 8? 0 to N do
9igFiG#draR
"ndH
t"c" %"z pro%l"ma# Qada shvati da j" 9igFiG instanca klas" Plan"Figur"
i da joj j" upuc"na poruka draR, pr"vodilac pronjuska po d"9iniciji
klas" Plan"Figur", vidi da tamo postoji m"tod draR, prov"ri tipov"
(u ovom slucaju n"ma sta da prov"rava zato sto m"tod n"ma argum"nata,
i uradi sv" ostalo sto tr"%a da uradi# Iinj"nica da j" m"tod draR
virut"lan ga "v"ntualno moz" nat"rati da g"n"ris" i n"ki dodatni
kood koji c" u toku izvrs"nja programa prov"ravati da li j" program"r
ispunio o%"canj" i o%"z%"dio m"tod draR u svim podklasama koj" s"
korist"#
2lava *#
3 ! kojoj s" vidi kada s" korist" virtu"lni m"todi i sta nama
3 pr"vodilac o%"cava
Virtu"lni m"todi s" javljaju u onim situacijama u kojima s" ono sto
m"tod tr"%a da uradi impl"m"ntira na potpuno razlicit" nacin" u
razlicitim podklasama t" klas"#
Qao prim"r moz" da posluzi klasa Plan"Figur" i nj"n" podklas"
Iircl", B"ctangl" i (riangl"# Qrug, pravougaonik i trougao s" crtaju
na potpuno razlicit" nacin"# N"ma sans" da s" u klasi Plan"Figur"
o%"z%"di m"tod koji %i %io u stanju da nacrta sv" sto moz" da
%ud" ravanska 9igura# :ato s" u klasi Plan"Figur" samo oznaci
da postoj" m"todi (draR i Rip" koj" moraju imati sv" podklas" klas"
Plan"Figur" i da c" oni %iti impl"m"ntirani t"k tamo# :asto5
:ato sto s" svaka vrsta ravanskih 9igura crta na svoj nacin#
Najvis" sto s" moz" oc"kivati od klas" Plan"Figur" j" to da
nagov"sti potr"%u za m"todima# Ona nista n" moz" da kaz" o njihovoj
impl"m"ntaciji#
Qada s" pr"vodi program napisan na n"kom OO j"ziku, a koji ima virtu"ln"
m"tod", staticka prov"ra tipova utvrdjuj" da li su ispunj"na sva
o%"canja koja j" program"r dao# Dakl", pr"vodilac prov"rava da li
postoji %ar j"dna impl"m"ntacija za svaki virtu"lni m"tod koji s"
javlja u programu# Naravno, moz" ih postojati vis"# Dinamicko
v"zivanj" m"toda odr"djuj" koju impl"m"ntaciju virtu"lnog m"toda
tr"%a shvatiti kao int"rpr"taciju poruk"#
2lava +#
3 /pstraktn" klas" i njihov" podklas"H uj"dno i kraj pric" o
3 virtu"lnim m"todima
Qlasa koja sadrzi virtu"ln" m"tod" s" zov" apstraktna klasa#
Qlasa koja n"ma virtu"lnih m"toda s" zov" konkr"tna klasa#
Podklasa apstraktn" klas" n" mora ponuditi impl"m"ntaciju za
virtu"ln" m"tod"# Stavis", podklasa apstraktn" klas" moz"
dodati i nov" virtu"ln" m"tod"# &itno j" samo to da za svaku
apstraktnu klasu postoji nj"na podklasa koja j" konkr"tna#
(im" s" o%"z%"djuj" da svaki virtu"lni m"tod %ud" n"kad i n"gd"
impl"m"ntiran#
(akodj", moguc" j" da podklasa n"k" konkr"tn" klas" %ud" apstraktna#
:a nju tada vazi sv" sto vazi i za ostal" apstraktn" klas"#
2lava 1#
3 'os j"dan korak du%lj" u apstraktno8 g"n"ricki kood i g"n"rick"
3 klas"
Posmatrajmo klasu Stack cij" instanc" su st"kovi# :a st"k nij" %itno
sta s" na nj"ga stavlja# Mi znamo da j" st"k n"sto na c"ga moz"mo
staviti n"sto drugo i to kasnij" sa nj"ga skinuti# S drug" stran",
kada impl"m"ntiramo st"k, moramo "ksplicitno nav"sti sta j" to
sto s" na st"k stavlja# Na prim"r, u Moduli-= s" st"k na koga
s" stavljaju c"li %roj"vi opisuj" ovako8
(NPA $ntStack ? PO$N(AB (O $ntStackAntrDH
$ntStackAntrD ? BAIOBD
in9o 8 $N(A2ABH
link 8 $ntStack
ANDH
dok s" st"k na koga s" stavljaju r"alni %roj"vi opisuj" ovako8
(NPA B"alStack ? PO$N(AB (O B"alStackAntrDH
B"alStackAntrD ? BAIOBD
in9o 8 BA/TH
link 8 B"alStack
ANDH
Opis j" skoro isti# Stavis", op"racij" za manipulaciju ovim
st"kovima su jos slicnij", %as zato sto st"k kao struktura
podataka savrs"no n" zavisi od onoga sto s" na nj"ga stavlja#
&ilo %i jako l"po kada %i nam j"zik pruzao mogucnost da opis"mo
st"k n"zavisno od toga sta s" na nj"ga stavlja, pa da od t"
j"dinstv"n" sp"ci9ikacij" kasnij" n"kako napravimo konkr"tnij" stvari
(kao sto su st"k c"lih %roj"va i st"k r"alnih %roj"va#
M"hanizam koga mnogi j"zici "ksploatisu da %i ovo ostvarili s"
zov" CCg"n"rick" klas"EE (ili CCg"n"ricki moduliEE# Avo prim"ra
klas" Stack u ps"udoj"ziku8
class StackFclass (GH
".port init, push, pop, 9ull, "mptDH
instanc" varia%l"s
s 8 arraD o9 (H
ma. 8 cardinalH
top 8 cardinalH
insanc" m"thods
init(M 8 cardinal is
%"gin
n"R(s, MH
ma. 8? MH top 8? ,
"nd initH
push(. 8 ( is
%"gin
i9 top U ma. th"n
ABBOB(WStack is 9ullW
"ls"
sFtopG 8? .H
inc(top
"nd "nd pushH
pop(var . 8 ( is
%"gin
i9 top ? , th"n
ABBOB(WStack is "mptDW
"ls"
. 8? sFtopGH
d"c(top
"nd "nd popH
9ull( 8 &ool"an is
%"gin
r"turn top U ma.
"nd 9ullH
"mptD( 8 &ool"an is
%"gin
r"turn top ? ,
"nd "mptDH
"nd Stack#
2"n"ricka klasa pr"dstavlja s"mu po kojoj s" mogu praviti razn" klas"#
(o j" nacin da s" odj"dnom opis" %"skonacno mnogo klasa# :a svaku
vr"dnost param"tra ( do%ija s" j"dna nova klasa#
Prim"ri upotr"%" klas" Stack izgl"daju ovako8
var $ntStack 8 StackFint"g"rGH
B"alStack 8 StackFr"alGH
Sada su $ntStack i B"alStack instanc" dv" razlicit" klas" (s tim da
su t" dv" klas" nastal" CCkonkr"tizacijomEE j"dn" ist" g"n"rick"
klas"# Proc"s u kom" s" od g"n"rick" klas" pravi konkr"tna klasa s"
zov" instanciranj" g"n"rick" klas"# Param"tar g"n"rick" klas" j"
najc"sc" n"ka druga klasa iYili n"ka konstanta#
2lava 0,#
3 Qoja zucn" n"sto o ogranic"nim g"n"rickim param"trima
:a n"k" g"n"rick" klas" j" %itno da klasa koja j" g"n"ricki param"tar
ima n"ka sp"cijalna svojstva# Na prim"r, kada pravimo klasu
&inS"arch(r"", %itno j" da "l"m"nti koji s" sm"staju u cvorov"
sta%la %udu takvi da s" mogu upor"djivati# Do%ro j" da s" sva takva
pos"%na svojstva pos"%no naglas" u d"klaraciji g"n"rick" klas"#
Avo prim"ra# N"ka j" data apstraktna klasa TinOrd"r koja opisuj"
lin"arno ur"dj"n" "l"m"nt"8
class TinOrd"rH
".port lt, l", gt, g"H
instanc" m"thods
lt (D 8 TinOrd"r 8 &ool"an is virtualH
l" (D 8 TinOrd"r 8 &ool"an is
%"gin
r"turn s"l9#lt(D or (s"l9 ? D
"nd l"H
gt (D 8 TinOrd"r 8 &ool"an is
%"gin
r"turn D#lt(s"l9
"nd gtH
g" (D 8 TinOrd"r 8 &ool"an is
%"gin
r"turn s"l9#gt(D or (s"l9 ? D
"nd g"H
"nd TinOrd"r#
Qlasa &inS"arch(r"" tada moz" da s" opis" ovako8
class &inS"arch(r""Fclass ((inh"rits TinOrd"rGH
".port n"R, ins"rtH
instanc" varia%l"s
in9o 8 (H
l"9t, right 8 &inS"arch(r""F(GH
instanc" m"thods
n"R(. 8 ( is
%"gin
in9o 8? .H
l"9t 8? N$TH right 8? N$T
"nd n"RH
ins"rt(. 8 ( is
%"gin
i9 null(s"l9 th"n
ABBOB(W/rghJW
"ls"i9 .#lt(in9o th"n
i9 null(l"9t th"n
l"9t#n"R(.
"ls"
"nd
l"9t#ins"rt(.
"ls"i9 null(right th"n
right#n"R(.
"ls"
right#ins"rt(.
"nd "nd ins"rtH
"nd &inS"arch(r""#
Pos"%nom d"klaracijom koju smo nav"li u zagradi iza g"n"rickog
argum"nta naglasavamo da s" kao argum"nt ( moz" pojaviti %ilo koja
klasa koja j" podklasa klas" TinOrd"r# (o nam tr"%a zato sto "l"m"nt"
koj" sm"stamo u cvorov" sta%la moramo por"diti#
2lava 00#
3 Qoja kazuj" da s" mogu praviti poklas" g"n"rick" klas"H
3 raj pric" o g"n"rickim klasama
:ivot s" i dalj" komplikuj"# '"dna od l"pih komplikacija j" to da
s" mogu praviti podklas" g"n"rick" klas"# ! takvim slucaj"vima
i podklasa mora %iti g"n"ricka# No, tu tr"%a uociti j"dnu suptilnost#
! ovom prim"ru8
class S"irdStackH
inh"rits StackFint"g"rGH
###
"nd S"irdStack#
klasa S"irdStack nij" podklasa g"n"rick" klas"# Qlasa S"irdStack
j" podklasa o%icn" klas", s tim da j" ta o%icna klasa nastala
instanciranj"m g"n"rick" klas"# Avo, sada, prim"ra klas" koja j"
doista podklasa g"n"rick" klas"8
class /noth"rS"irdStackF(GH
inh"rits StackF(GH
###
"nd /noth"rS"irdStack#
Ova klasa j" g"n"ricka i nasl"djuj" g"n"ricku klasu# (ako, moz"mo
praviti citav" mr"z" g"n"rickih klasa i na taj nacin pisati v"oma
apstraktan kood#
2lava 0=#
3 ! kojoj s" vidi sta j" to vis"struko nasl"djivanj"
Vis"struko nasl"djivanj" j" m"hanizam u kom" j"dna klasa moz"
nastati nasl"djivanj"m oso%ina n"koliko klasa# Avo prim"ra8
class IolourH
".port s"tIolour, colourO9H
instanc" varia%l"s
col 8 cardinalH
instanc" m"thods
s"tIolour(c 8 cardinal is ###H
colourO9( 8 cardinal is ###H
"nd Iolour#
class &RPlan"Figur"H
".port s"tI"nt"r, s"tNam", mov"H
instanc" varia%l"s
c"nt"r-, c"nt"rN 8 cardinalH
nam" 8 stringH
instanc" m"thods
s"tI"nt"r(., D 8 cardinal is ###H
s"tNam"(n"RNam" 8 string is ###H
mov"(d., dD 8 cardinal is ###H
"nd &RPlan"Figur"#
class Iolour"dIircl"H
inh"rits Iolour, &RPlan"Figur"H
".port draR, Rip"H
instanc" varia%l"s
radius 8 cardinalH
instanc" m"thods
draR( is ###H
Rip"( is ###H
"nd Iolour"dIircl"#
Qlasa Iolour"dIircl" j" klasa koja j" nasl"dila kood od dv" klas"8
Iolour i &RPlan"Figur"# Ona nasl"djuj" prom"nljiv" i m"tod" od o%"
klas", i uz put doda jos koju prom"nljivu i m"tod# /ko j" cc
d"klarisana ovako
var cc 8 Iolour"dIircl"H
onda j" ovo validan niz poruka8
cc#s"tIolour(*H
cc#s"tNam"(WIrv"ni krugWH
cc#s"tI"nt"r(0,,0,H
cc#mov"(-0*,)H
###
i9 cc#colourO9( ? 0< th"n ### "ndH
$nstanca klas" Iolour"dIircl" ima oso%in" i j"dn" i drug" klas"#
2lava 0<#
3 Pro%l"mi### (za prom"nu
Pro%l"mi nastaju kada klas" od kojih nasa klasa nasl"djuj" oso%in"
imaju m"tod" sa istim im"nom# Na prim"r ovako8
class IolH
".port s"t, g"tH
instanc" varia%l"s
col 8 cardinalH
instanc" m"thods
s"t(c 8 cardinal is ###H
g"t( 8 cardinal is ###H
"nd Iol#
class &RPFH
".port s"t, s"tNam", mov"H
instanc" varia%l"s
c"nt"r-, c"nt"rN 8 cardinalH
nam" 8 stringH
instanc" m"thods
s"t(., D 8 cardinal is ###H
s"tNam"(n"RNam" 8 string is ###H
mov"(d., dD 8 cardinal is ###H
"nd &RPF#
class IolIircH
inh"rits Iol, &RPFH
".port draR, Rip"H
instanc" varia%l"s
radius 8 cardinalH
instanc" m"thods
draR( is ###H
Rip"( is ###H
"nd IolIirc#
Prilikom pr"vodj"nja klas" IolIirc pr"vodilac uocava da klas" Iol
i &RPF imaju m"tod sa istim im"nom8 s"t# Iompilation "rror8 Nam" clash#
(o s" c"sto d"sava zato sto s" n"k" op"racij", mada nad razlicitim
vrstama podataka, naj%olj" opisuju istim im"nom
2lava 0M#
3 $ op"t r"s"nj"8 prom"na im"na
Najj"dnostavniji nacin da s" razr"s" pro%"lmi sa istoim"nim m"todima
j" da s" uv"d" m"hanizam prom"n" im"na# $d"ja j" u tom" da s" u sklopu
inh"rits d"klaracij" omoguci da s" n"kim m"todima prom"ni im" samo
za potr"%" t"kuc" klas"# $ to radi 9ino# B"s"nj" pro%l"ma IolIirc
%i moglo da izgl"da ovako8
class IolIircH
inh"rits Iol(r"nam" s"t as s"tIol,
&RPF(r"nam" s"t as s"tPosH
".port draR, Rip"H
instanc" varia%l"s
radius 8 cardinalH
instanc" m"thods
draR( is ###H
Rip"( is ###H
"nd IolIirc#
Qada pis"mo kood za klasu IolIirc j"dan m"tod ima im" s"tIol, a
drugi s"tPos i tim" j" kon9likt razr"s"n# (r"%a imati u vidu da j"
ova prom"na im"na, kao sto j" v"c r"c"no, lokalna# $m"na s"tIol
i s"tPos vaz" samo u klasi IolIirc# Ostatak univ"rzuma t" m"tod"
vidi pod starim im"nom i, ako zatr"%a, moz" da im (op"t lokalno
prom"ni im"na#
2lava 0P#
3 ! kojoj s" pojavljuj" j"dan suptilniji pro%l"m8 ponovlj"no
3 nasl"djivanj" (r"p"at"d inh"ritanc"
Posmatrajmo klasu /# N"ka su &0 i &= nj"ni nasl"dnici i n"ka j" klasa
I nasl"dnik klasa &0 i &=8
class /H
###
"nd /#
class &0H class &=H
inh"rits /H inh"rits /H
### ###
"nd &0# "nd &=#
class IH
inh"rits &0, &=H
###
"nd I#
Qlasa / o%"z%"djuj" n"k" prom"nljiv" (instanc" varia%l"s i m"tod"#
Svaka instanca klas" &0 ima svoju kopiju prom"nljivih iz klas" /,
dok svaka instanca klas" &= ima svoju kopiju# Da li instanc" klas"
I tr"%a da imaju dv" kopij" prom"nljivih koj" poticu iz klas" /
ili samo j"dnu5 Drugim r"cima, koliko puta c" klasa I nasl"diti
klasu /5 Da li dva puta ili j"dnom5
$ma opravdanja i za j"dno i za drugoJ $ma situacija kada j" potr"%no
klasu / nasl"diti j"dnom, a ima situacija kada j" potr"%no klasu /
nasl"diti dva puta# Avo prim"ra8
class /ddr"ssH
###
instanc" varia%l"s
str""t 8 stringH
no 8 cardinalH
citD 8 stringH
zip 8 cardinalH
###
"nd /ddr"ss#
class Kom"H
inh"rits /ddr"ssH
###
"nd Kom"#
class &usin"ssH
inh"rits /ddr"ssH
###
"nd &usin"ss#
class Kom"&usin"ssH
inh"rits Kom", &usin"ssH
###
"nd Kom"&usin"ss#
/ko por"tpostavimo da klasa /ddr"ss opisuj" podatk" o adr"si
(postanskoj n"kog o%j"kta, ako klasa Kom" opisuj" kucu u kojoj
n"ko stanuj", klasa &usin"ss opisuj" posao kojim s" n"ko %avi,
a klasa Kom"&usin"ss opisuj" posao kojim s" n"ko %avi kod svoj" kuc",
onda klasa Kom"&usin"ss tr"%a samo j"dnom da nasl"di klasu /ddr"ss#
Bazlog j" j"dnostavan8 o%" stvari s" d"savaju na istoj adr"siJ
Pogl"dajmo, sada, drugi prim"r8
class IolourH ### "nd Iolour#
class 'ack"tH inh"rits IolourH ### "nd 'ack"t#
class (rous"rsH inh"rits IolourH ### "nd (rous"rs#
class ShirtH inh"rits IolourH ### "nd Shirt#
class !nd"rR"arH inh"rits IolourH ### "nd !nd"rR"ar#
class Sho"sH inh"rits IolourH ### "nd Sho"s#
class Out9itH
inh"rits 'ack"t, (rous"rs, Shirt, !nd"rR"ar, Sho"sH
###
"nd Out9it#
Qako svaki d"o od"c" ima svoju %oju, i kako sv" %oj" mogu %iti
razlicit", klasa Out9it tr"%a da nasl"di klasu Iolour p"t puta#
/ko j"dna klasa nasl"djuj" drugu klasu vis" od j"dnom, takav o%lik
nasl"djivanja s" zov" ponovlj"no nasl"djivanj" (r"p"at"d inh"ritanc"#
'asno j" da s" takav o%lik nasl"djivanja moz" javiti samo kod
OO j"zika sa vis"strukim nasl"djivanj"m#
2lava 0)#
3 Qoja govori o tom" kako razliciti j"zici r"savaju pro%l"m
3 ponovlj"nog nasl"djivanja
Bazni j"zici r"savaju pro%l"m ponovlj"nog nasl"djivanja na razn"
nacin"# N"ki j"zici j"dnostavno zan"maruju ovaj pro%l"m i
opr"d"l" s" iskljucivo za j"dnu ili drugu varijantu
kod ponovlj"nog nasl"djivanja8 ili s" svaka klasa nasl"di tacno
j"dnom, ili s" svaka klasa nasl"di onoliko puta koliko s" puta
nj"n" podklas" pojav" i inh"rits listi#
(o su in9"riorna r"s"nja# &olji j"zici to r"s" tako sto omoguc"
o%a m"hanizma nasl"djivanja, pa program"r oda%"r" v"rziju koja mu
odgovara# Qao sto smo vid"li, o%a pogl"da su potr"%na#
Ovakav pristup ima Ai99"l# On omogucuj" da s" klasa nasl"di j"dnom
ili vis" puta, a to postiz" kroz suptilan m"hanizam prom"n" im"na
(pravilo j" j"dnostavno8 ako s" im"na m"toda iz klas" pr"im"nuju,
onda s" klasa nasl"djuj" n"koliko putaH ako s" pak n" pr"im"nuju
v"c s" zadrz" iskljucivo originalna im"na, onda s" klasa
nasl"di samo j"dnom#
2lava 0*#
3 Qoja govori o cistim i hi%ridnim OO j"zicima
OO j"zika ima raznih vrsta# N"k" do njih smo pom"nuli jos na poc"tku#
No, ima i grugih pod"la# '"dna od znacajnijih j" pod"la na 4cist"4
i 4hi%ridn"4 OO j"zik"# OO j"zik j" cist ako s" svi podati opisuju
u t"rminima klasa i sv" akcij" s" iskazuju u o%liku upucivanja
poruka# Na prim"r, u cistim j"zicima s" sv" akcij", pa i akcija
a 8? %#nam"O9
shvata kao upucivanj" poruk" o%j"ktu (u ovom slucaju, o%j"ktu a
upucuj"mo poruku 8? %#nam"O9# Iisti OO j"zici su, na prim"r,
Smalltalk i Ai99"l#
Ki%ridni j"zici su m"savin" OO i n"kog drugog stila, r"cimo
imp"rativnog# Qod hi%ridnih j"zika s" klas", o%j"kti i poruk" m"saju
sa tipovima, strukturama i nar"d%ama# Ki%ridni (imp"rativni j"zici
podrzavaju %ar dv" vrst" akcija8 slanj" poruk" i poziv proc"dur"#
(ako, u v"likom %roju hi%ridnih (imp"rativnih j"zika s" akcija
a 8? %#nam"O9
shvata kao poziv CCproc"dur"EE 8? sa argum"ntima %#nam"O9 i a#
Naravno, kao hi%ridni j"zici s", por"d imp"rativnih OO j"zika,
mogu javiti logicki OO j"zici, 9unkcionalni OO j"zici, ###
:%og toga sto podrzavaju m"savinu pogl"da na sv"t, hi%ridni
j"zici mogu %iti v"oma komplikovani# Njihova s"mantika j" najc"sc"
9ormulisana u o%liku niza sloz"nih pravila#
:a hi%ridn" OO j"zik" j" karakt"risticno jos i to da s" klas"
impl"m"ntiraju kao pos"%na vrsta tipova podataka# (ako, j"dan
modul moz" sadrzati opis n"koliko klasa# Qod cistih OO
j"zika to uglavnom nij" tako# (u klas" sluz" i kao m"hanizam
uvodj"nja novih vrsta podataka i kao m"hanizam raz%ijanja programa
na modul"#
2lava 0+#
3 Qoja pr"dstavlja kom"ntar i zakljucak
OO id"ja j" prilicno stara (01)*, ali t"k u posl"dnj" vr"m"
postaj" popularna# Moglo %i s" cak r"ci da s" d"silo i n"sto
n"poz"ljno8 n" samo da j" postala priznata kao l"pa i korisna
id"ja, v"c j" postala moda# OO j" danas 4in4#
(o nij" do%ro# $ma pro%l"ma za koj" n"ma potr"%" koristiti OO#
$ma pro%l"ma koji s" mogu mnogo %rz" i j"dnostavnij" r"siti
klasicnim m"todama# S drug" stran", proj"ktovanj" v"likih
so9tv"rskih sist"ma moz" %iti mnogo laks" uz OO#
OO n" tr"%a gurati tamo gd" mu nij" m"sto# Na prim"r, OO sist"mi
nos" odgovarajuci ov"rh"ad %ar z%og dv" stvari8 dinamickog
v"zivanja m"toda i kuplj"nja dju%r"ta (gar%ag" coll"ction#
:ato oni uglavnom nisu pogodni za r"al-tim" aplikacij"#
OO j" korisna i do%ra m"todogija, ali nikako n" i naj%olja#
Sv" to tr"%a imati u vidu kada s" %ira alat pri ulasku u
v"liki proj"kt#
Ovo j" kraj Sag" o OO# Iilj j" %io da s" uv"du i ilustruju osnovni
pojmovi i da s" pokazu n"k" t"hnik" impl"m"ntacij" OO j"zika#
Saga nikako nij" potpun vodic kroz o%last, niti j" d"9initivna
d"9inicija osnovnih pojmova# OO programiranj" j" jos uv"k u
"ksp"rim"ntalnoj 9azi, i ko zna koji m"hanizmi c" za 0, godina
%iti prihvac"ni kao do%ri#
Saga j" tr"%alo da da osnovn" in9ormacij" o o%lasti i tako olaksa
samostalan rad i dalj" uc"nj"# Nadam s" da j" u tom" %ar d"lom
usp"la#
Saga o OOP, Dodatak8 I"mu OOP
:oran &udimac
(u sklopu Vannastavnih aktivnosti iz programiranja, PMF-Novi Sad
2lava D0#
Da j" kriza sa so9tv"rom, to j" svakom" jasno# Pa i laicima koji su imali
n"sr"cu da ih iko ikad in9ormatizuj"# (" n" radi, t" n" radi onako kako
tr"%a, t" ovo t" ono# Pa su s" ljudi poc"li vr"m"nom pitati zasto im
r"cimo (V (uglavnom radi i zasto s" zgrada u kojoj stanuju vrlo r"tko
rusi, a taj prokl"ti program nikako da proradi kao sto tr"%a###
/ko pr"tpostavimo da j" to tako zato sto s" v"cina stvari programira
ispoc"tka, (sa o%av"znim gl"danj"m u sourc", koji j" c"sto i n"ko
drugi pravio, pa s" tako n"k" gr"sk" ponavljaju, a %ogami s" naprav" i
nov"### ako j" dakl" pro%l"m sto s" vrlo r"tko korist" 4postoj"c"
i ist"stiran"4 stvari, onda j" r"s"nj" napraviti modul" (Wcipov"W
koji %i tacno odgovarali unapr"d dogovor"nim sp"ci9ikacijama i koji %i
s" um"tali na odgovarajuca m"sta u programima# /ko s" %as na trzistu
WcipovaW n" moz" pronaci onaj koji nam t"r"%a, onda n" %i %ilo zgor"g
napraviti m"hanizam koji c" nam omoguciti da iskoristimo on" stvari
koj" nam iz WcipaW odgovaraju, t" da n"k" malko doradimo ili izm"nimo#
Dorada i izm"na %i s" morali napraviti tako da s" nikako n"
4int"r9"riraju4 sa onim sto v"c postoji u WcipuW t" da samo korist"
W9unkcionalnostW onoga sto tamo postoji, nadogradjivanj"m#
2lava D=#
Ostarivanj"m tog id"ala %i s" program"ri pod"lili u M grup", pr"ma
int"r"sovanjima i kvalit"tima###
Prva grupa %i n"gd" u WsilikonskimW dolinama u st"rilnim prostorijama i
sa rukavicama na rukama pravila Wcipov"W# WIipoviW %i odgovarali
sp"ci9ikacijama koj" su ranij" dogovor"n" na Wplan"tarnomW nivou i nosili
%i n"k" oznak" (SPIY0Mm, na prim"r# (u %i morali raditi oni koji su
postigli Wunutrasnju harmonijuW ili oni koji imaju do%r" v"z"###
N"gd" malo iza njih na pokr"tnoj traci (a u malo lagodnijoj atmos9"ri,
%i %ili WkontroloriW koji %i prov"ravali da li WcipoviW odgovaraju
sp"ci9ikacijama# Skartovi %i %ili od%acivani, a kr"atori skartova %i
do%ijali otkaz### Ovd" %i mogli da rad" propali asist"nti###
(r"ca grupa program"ra %i s" okupljala u 9a%rikama korisnickih
programa# (akv" 9a%rik" %i od 9a%rika WcipovaW r"dovno do%ijal"
katalog" najnovijih cipova sa oznkama i sp"ci9ikacijama# Fa%rik"
korisnickih programa %i od postoj"cih WcipovaW sklapal" sopstv"n"
program" koji tr"%a da r"s" n"ki konkr"tan pro%l"m# /ko j" 9a%rika
do%ra, ona %i od WcipovaW mogla da napravi tzv# Wkartic"W za koj" moz"
da oc"kuj" masovniju prodaju# /ko odgovarajuci WcipW n" postoji na
trzistu, 9a%rika %i oda%rala najpri%lizniji WcipW, nasl"dila
nj"gov" do%r" oso%in" i malo ih prilagodila, pri tom" n" m"njajuci
unutrasnjost WcipaW (j"r za tako n"sto ni n"ma mogucnosti#
(akva op"racija %i s" nazivala Wl"mlj"nj"mW# Ovd" %i radili program"ri
sa WharmonijomW, ali %"z do%rih v"za koj" %i ih u%acil" u
Wsilikonsk" dolin"W#
I"tvrta grupa program"ra %i %ila poznata pod nazivom WmajstoriW# Njih
%ist" zvali kad vam program odj"dnom vis" n" radi, a do juc" j" radio#
WMajstorW %i (posto j" pr"thodno trgnEo rakijicu pokusao da popravi
program# ! zavisnosti od nj"govih sposo%nosti, on %i mogao da odn"s"
WkarticuW u s"rvis i da vam posl" don"s" drugu (trazio j" r"cimo novu,
%olju karticu od 9a%rik"# Mogao %i da vam zam"ni cip koji mu j"
sumnjiv, sa n"kim novim koji s" n"davno pojavio na trzistu# /ko j"
malko vispr"niji, mogao %i mozda da zam"ni cip svojim sopstv"nim, koga
j" mukotrpno pravio nocu, uz sv"cu (mada %i takv" slucaj"v"
za%ranjivalo udruz"nj" Wsilikonskih program"raW# Mogao %i i da prizna
da on to n" zna j"r su to sv" n"ki novi cipovi, o kojima on n" zna puno
i da vam pr"poruci drugog majstora####
Majstor %i takodj" morao da poznaj" katalog" WcipovaW i njihov"
sp"ci9ikacij", mada n" %as sv" - na prim"r samo on" koj" standardno
upotr"%ljava 9a%rika WkarticaW za koj" s" on sp"cijalizovao# /ko %i
majstor %io privatnik, on %i morao imati do%ru v"zu u N"mackoj koji %i
mu na%avljao nov" r"z"rvn" d"lov"###
2lava D<#
Naj%liz" opisanom id"alu (standardnim cipovima koji s" n" mogu m"jati
n"go samo uglavljivati u za to pr"dvidj"na m"sta j"
o%j"ktno-orij"ntisano proj"ktovanj", programiranj", %az" podataka ###
$ sta sad n" valja5
N" valja sto s" u tim cipovima ponovo moz" naci n"ist"stirano
Wdju%r"W, koj" c" j"dnom, %as kad n" %ud" tr"%alo, da Wcrkn"W#
N" valja sto (%ar sud"ci po g-dji Mili Mitic s" nista nalik na
opst" prihvac"n" cipov" sa oznakama jos nij" pojavilo (%ar iz
o%lasti OO proj"ktovanja# Dakl", n"ma opstijih %i%liot"ka, n"go svako
sam koristi svoju %i%liot"ku, za sta mu (o%j"ktivno govor"ci,
OOP n" ni tr"%a###
/li pr"thodna dva Wn"valjanjaW n"maju nikakv" v"z" sa OOP kao id"jom,
n"go sa n"savrs"nocu cov"ka###

You might also like