You are on page 1of 19

Klase i objekti

U ovom poglavlju emo predstaviti koncepte (i.e. object think) i terminologiju (i.e.
object speak) objektno-orijentiranog programiranja (OOP-a). Objekti su u sreditu
programiranja Visual Basicom. Forme i kontrole su objekti, baze podataka su objekti.
Objekti u Visual Basicu su svuda oko vas.
Objekti zaahuruju podatke (attributes) i metode (behaviors) tj. sadravaju i svoje
podatke i svoj programski kod to ih ini lakim za odravanje od tradicionalnog
naina pisanja koda.
Objekti Visual Basica imaju svojstva (properties), postupke (methods) i dogaaje
(event). Svojstva su podaci koji opisuju objekt. Objektu moete rei da napravi
poslove koji se nazivaju postupci. Dogaaji su djela koja objekt radi tj. moete
napisati kod koji e biti izveden kad se pojavi odreeni dogaaj.

Poglavlje 10

U osnovi i vi ste jedan objekt. Imate svojstva kao to su boja kose i oiju, broj cipela
koji nosite, te metode pranje zubi i sl.
Kontrola za unos teksta TextBox ima svojstva Text, Hight, Width, TabIndex, te metode
SetFocus, Move i sl.
Objekti imaju svojstvo skrivanja podataka (data hiding). To znai da iako objekti
mogu komunicirati izmeu sebe, objekti nemoraju znati kako su drugi objekti
implementirani ve su implementacijski detalji skriveni unutar samog objekta.
Mogue je voziti auto bez poznavanja detalja poput rada motora ili prenosnog
sustava. Skrivanje podataka je kljuno u ispravnom pisanju softwera.
U Visual Basicu, osnova objektno-orijentiranog programiranja je klasa iz koje se
kreiraju objekti. Za objekt se kae da je primjer klase. Moe se rei da su klase
korisniki definirani tipovi (user-defined type ili krae UDT). Za njih se koristi i pojam
od programera definirani tipovi (programmer-defined type). Svaka klasa sadri
podatke jednako kao i skup metoda preko kojih se tim podacima manipulira. Klasa
odreuje suelje objekta, njegov opseg vidljivosti, te pod kojim uvjetima e biti
stvoren. Opisi klasa spremljeni su u tipskim bibliotekama (type libraries).
Jednako kao to ste instancu ugraenog tipa npr. Integer nazivali varijablom, instancu
klase nazivamo objektom. Kako bi upotrijebili objekt, morate imati upuivanje na
njega u varijabli objekta. Tip povezivanje odreuje brzinu kojom e se pristupati
postupcima objekta koritenjem varijable objekta.
Varijabla objekta moe biti kasno povezana (late bound , najsporije) ili rano povezana
(early bound). Rano povezane varijable mogu biti povezane nainom DispID ili
povezane nainom VTable (najbre). O karakteristikama povezivanja pogledajte
kasnije u dodatku poglavlja.
Skup svojstava i postupaka naziva se suelje (interface). Podrazumijevano suelje
objekata Visual Basic-a je dvostruko suelje koje podrava sva tri oblika povezivanja.
Kao dodatak njihovom podrazumijevanom suelju, objekti VB-a mogu ostvariti i
viestruka suelja koja su osobina modela objekata kao sastavnog dijela (Component
Object Model ; COM).
Klase Visual Basica mogu takoer biti svjesne podataka (data aware). Klasa moe
djelovati kao potroa podataka (data consumer) ili kao izvor podataka (data source)
za druge objekte pruajui podatke iz vanjskog izvora.
Visual Basic programeri razvijaju nove klase ali i iskoritavaju ve postojee.
Kombiniranjem novih sa ve postojeim dobro definiranim i dokumentiranim te
paljivo testiranim klasama nastaju nove aplikacije u mnogo kraem razvojnom
vremenu sa manjim trokovima odravanja u radu. Moemo rei da softverska
iskoristivost (software reusability) ubrzava razvoj monih, visoko kvalitetnih
aplikacija. Danas je od posebnog znaaja tzv. Rapid applications development (RAD).
Objekti su entiteti kreiranu u vremenu izvravanja programa (run-time) koji
zahtijevaju memoriju i mogue i neke druge sistemske resurse, a bivaju uniteni kada
vie ne postoji potreba za njima ili je kraj aplikacije.
Nasuprot objektima, klase su dijelovi programa koje definiraju svojstva, metode i
dogaaje, jednom rijeju ponaanje jednog ili vie objekata koji se iz te klase kreiraju
za vrijeme izvrenja programa.
Mee se rei, klase su entiteti koji nastaju za vrijeme kreiranja objekta
(design-time) dok su objekti entiteti nastali za vrijeme izvravanja programa.

Klase i objekti
Korisnici aplikacije nikada ne vide klase, ve interaktivno komuniciraju sa objektima
kreiranim iz klasa, kao to su npr. izlazni rauni, podaci o kupcu ili geometrijski likovi
na ekranu.
Tri glavna potpornja objektno-orijentiranog programiranja su: ahurenje
(encapsulation), nasljeivanje (inheritance) i mnogooblinost (polymorphism) koji e
biti poblie objanjeni u narednim poglavljima.
Objekti su osnova na kojoj se temelji gotovo sve nove pojave u Visual Basic-u. Bez
objekata je nemogue ozbiljnije programirati baze podataka, razvijati Internet
aplikacije ili pisati komponente za COM (Component Object Model), DCOM
(Distributed COM), ili MTS (Microsoft Transaction Server).
Vano je da piete programe koji su razumljivi i jednostavni za odravanje. Izmjene u
programu su prije pravilo nego izuzetak te programer mora unaprijed raunati na
modifikacije koda. Upravo koritenje klasa znaajno doprinosi lakem modificiranju
programa.

APSTRAKTNOST PODATAKA I SKRIVANJE PODATAKA


Klase skrivaju svoje implementacijske detalje od klijenta odnosno korisnika to je
poznato kao skrivanje podataka (data hiding). Zamislimo neku apstraktnu klasu kojoj
prosljeujemo gomilu brojeva na privremenu pohranu te nakon nekog vremena tu
istu gomilu vraamo nazad. Pohrana pristigle gomile unutar klase moe bit ostvarena
na razliite naine (nizovi, kolekcije, linkane liste ...) ali klijent klase to ne mora znati.
Jedina stvar od njegova interesa je na koji nain e podatke prosljediti objektu klase,
odnosno na koji nain e te iste podatke dobiti nazad.
Opisivanje nekog objekta pomou ponaanja a bez zanimanja za to na koji nain je to
ponaanje zapravo implementirano se naziva apstraktnost podataka (data
abstraction).
Klijent klase koristi klasu bez poznavanja njenih internih detalja urejenja. Ako se
njena implementacija mijenja (recimo radi ispravljanja bug-ova ili popoljanja
performansi) a uz uvjet da suelje klase ostane isto (svaka metoda i nadalje ima isto
ime, povratni tipovi i parametri nisu promijenjeni u novoj definiciji klase), nema
potrebe za mijenjanjem koda klijenta koji tu klasu koristi to znaajno
pojednostaljuje modifikacije sistema.

LANOVI KLASE
Podaci u klasi se nalaze u instantnim varijablama. Mogu biti Public ili Private. Javne
instantne varijable i javne metode su pristupane svakom modulu unutar projekta.
Privatnim varijablama se moe manipulirati jedino pomou metoda unutar klase.
Privatne metode se ponekad nazivaju uslunim ili pomonim metodama.
Kada se izostavi kljuna rije Private ili Public, procedure svojstava, funkcijske
procedure i Sub procedure su podrazumijevano javne, a instantne varijable privatne.
Grupirajte Public lanove i grupirajte Private lanove u definiciji klase radi jasnoe i
itljivosti.

Poglavlje 10
MODULI KLASE KORAK PO KORAK
Otvorite novi standardni izvrni projekt, i ubacite modul klase odabirom Project|Add
Class Module opcije menija. Podrazumijevano, prvi klasni modul je nazvan Class1,
te je prva stvar koju treba napraviti izvriti njegovo preimenovanje u neko prikladnije
ime. Poto ete u ovom primjeru kreirati klasu koja predstavlja neku osobu, nazovite
je CPerson. Ova klasa je dosta dobar primjer jer su sva njena svojstva i ponaanja
svagdanja i lako razumljiva.
Preporuka Microsoft-a je koritenje prefiksa cls za ime klase, iako se ee susree
prefiks c.
Zasigurno postoji na desetke atributa koji se mogu vezati za neku osobu. Za poetak
vaa klasa ukljuuje samo dva svojstva:

FirstName
LastName

Oba svojstva su izloena kao javni lanovi klase odnosno deklarirana koritenjem
kljune rijei Public u deklaracijskoj sekciji klase CPerson.

Option Explicit
Public strFirstName As String
Public strLastName As String
Kreirajte formu pod imenom frmPerson, te dodajte sljedee TextBox kontrole i
jednan komandnim botunom:

Tip kontrole

Ime kontrole

Text

TextBox

txtFirstName

<prazno>

TextBox

txtLastName

<prazno>

TextBox

txtBirthDate

<prazno>

ComandButton

cmdOK

OK

Klase i objekti
Dvaput kliknite na komandni botun dok se ne pojavi prozor za unos teksta te potom
unesite sljedei kod:

Private Sub cmdOK_Click()


Dim person As CPerson
Set person=New CPerson
person.strFirstName=txtFirstName
person.strLatName=txtLastName
MsgBox person.strFirstName & & person.strLastNam
End Sub
Varijabla person je objektna varijabla u koju se pohranjuje memorijska adresa
odnosno upuivanje na objekt.
Za razliku od obinih varijabli, koje se mogu upotrijebiti neposredno nakon
deklariranja, objektnoj varijabli mora biti eksplicitno pridrueno upuivanje na neki
objekt prije pozivanja njegovih svojstava i metoda.
Kada objektna varijabla ne sadri upuivanje na objekt ona poprima vrijednost
Nothing.
Da bi upotpunosti razumijeli ta to zapravo znai iskuajte sljedei kod:

Dim person As CPerson


'Set person=New CPerson
Print person.strFirstName
Pokretanje ovakvog koda bi znailo podizanje pogreke Object variable or With
block variable not set.
Ovakvo ponaanje je poeljno jer nema mnogo smisla prikazivati svojstvo nekog
objekta koji zapravo i ne postoji. Prethodnim testiranjem sadraja objektne varijable
koritenjem Is Nothing testa ovakve poruke se mogu izbjei:

If Not (person Is Nothing) Then MsgBox person.strFirstName


Deklariranjem auto-instantnih objektnih varijabli mogue je kreirati novi objekt i
odmah potom mu pridruiti njegova svojstva:

Dim person As New CPerson


Odreivanjem varijable objekta kljunom rjei New, Visual Basic automatski stvara
novi objekt kad prvi put upotrijebite varijablu. To ima za posljedicu blagi performansni
udar jer pozivi svojstvima i metodama objekta moraju ekati da se on u potpunosti
kreira.
Auto-instantne objektne varijable imaju kako prednosti tako i nedostataka:

Reduciraju koliinu koda koju trebate napisati da bi radili sa klasama te su


zbog toga prikladne pri izradi prototipa aplikacije.
Nemogu biti testirane na vrijednost Nothing.
Tee eliminiranju pogreaka to nam ponekad i ne odgovara. Naime, za
vrijeme razvojne faze elimo vidjeti greke jer one mogu biti simptomi
ozbiljnijih nedostataka u logici koda. Koritenjem auto-instantnih varijabli
nikada nemoete biti sigurni kada je i zato neki objekt bio kreiran to je
najvei nedostatak u njihovu koritenju.
Ne moete deklarirati auto-instantnu varijablu openitog tipa, kao to je
Object ili Form jer Visual Basic mora znati koju vrst objekta e kreirati prilikom
prvog upuivanja varijable.

Auto-instantne objektne varijable nisu najbolji izbor i u principu ih treba izbjegavati.

Poglavlje 10
PROCEDURE SVOJSTAVA
Svojstva i postupci (atributi) klase ine njezino podrazumijevano suelje. Openito
svojstva predstavljaju podatke o objektu, dok postupci predstavljaju akcije koje
objekt moe poduzeti. Moemo rei svojstva pruaju opis objekta, dok su postupci
njegovo ponaanje.
Najlaki nain odreivanja svojstava klase je dodavanje javnih varijabli modulu klase
kao to smo to i uinili u prethodnom primjeru:

Public strFirstName As String


Public strLastName As String
Ovime smo omoguili da svaki programski kod koji ima pokaziva (referencu) na
objekt person moe bez ikakve validacije promijeniti ime ili prezime to nije u skladu
sa jednom od temeljnih koncepcija objektnog programiranja a to je skrivanje
informacija. Skrivanje informacija znai da moete napraviti promjene unutar klase,
npr. promjena tipa privatne varijable sa Integer na Long a bez utjecaja na vanjski kod
koji koristi objekt Person.
Dosadanji nain na koji je ureena klasa CPerson vam omoguava da prosljedite
prazni string u oba njena kreirana svojstva to ba i nema logikog smisla. Da bi to
onemoguili potrebno je promijeniti interno ureenje klase transformiranjem
svojstava u privatne lanove i njihovim ahurenjem u obliku para svojstava
procedura.
Potprogrami svojstava e pomno ispitati svaki pokuaj postavljanja objektovih
podataka i odbiti nevaljane podatke kako bi osigurao njihovu stalnu ispravnost unutar
objekta, ime se eliminira velik broj bug-ova.
Sljedei primjer prikazuje novo ureenje naa klase:

Private m_strFirstName As String


Private m_strLastName As String
Property Get FirstName() As String
FirstName = m_strFirstName
End Property
Property Let FirstName(ByVal newValue As String)
If newValue = "" Then Err.Raise 5
m_strFirstName = newValue
End Property
Programski kod za Property Get i Property Let LastName procedure je slian.
Ovakvim ureenjem smo dobili snaniju klasu koja uskrauje pridruivanje pogrenih
vrijednosti u svoja svojstva.
Pokuajte sljedeu komandu:

person.strFirstName = ""
Rezultat e biti podizanje pogreke sljedeeg sadraja:

argument"

"Invalid procedure call or

Klase i objekti
Ako pokuate pratiti izvravanje programa naredbu po naredbu pritiskom na F8,
vidjeti e te da svaki put kada pridruite novu vrijednost svojstvu, Visual Basic
provjerava dali postoji odgovarajua Property Let procedura u koju potom prosljeuje
novu vrijednost. U sluaju da validacija utvrdi neispravnost prosljeenih podataka,
procedura podie pogreku i vraa poziv pozivatelju. U protivnom, prosljeena
vrijednost se pridruuje privatnoj varijabli m_FirstName.
Kada programski kod pozivatelja potrauje vrijednost svojstva, Visual Basic izvrava
odgovarajuu Property Get proceduru, koja vraa vrijednost Privatne varijable.
Normalno, tip vrijednosti koja se prosljeuje Property Get procedurom mora
odgovarati tipu koji je objektu prosljeen Property Let procedurom.
Ime privatne varijable koja sprema vrijednost svojstva sainjeno je od prefiksa
opsega djelovanja (m_) koje je oznaava kao varijablu na razini modula; prefiksa tipa
varijable (str); te imena varijable (FirstName). Koritenjem istog imena kao i za
svojstvo slui kao podsjetnik da su varijabla i svojstvo povezani.
Potprogrami svojstava su podrazumijevano javni, pa ako izostavite kljunu rije
Public, i dalje e biti javni.
Dobra je praksa koristiti kljunu rije Public, ak iako nije potrebna, jer ini jasnim
vae namjere.
Naoj klasi emo sad dodati BirthDate svojstvo koje ukljuuje i kod za validaciju:

Private m_dtBirthDate As Date


Property Get BirthDate() As Date
BirthDate = m_dtBirthDate
End Property
Property Let BirthDate(ByVal newValue As Date)
If newValue >= Now Then Err.Raise 1001, , "Future Birth
Date !"
m_dtBirthDate = newValue
End Property
Ova klasa se moe predstaviti UML-om (Universal modeling language), na sljedei
nain.
CPerson
-m_strFirstName : String
-m_strLastName : String
-m_dtBirthDate : Date
+FirstName() : String
+LastName() : String
+BirthDate() : Date

SVOJSTVA SAMO ZA ITANJE (Read-only properties)


Ako pogledate kotrole Visual Basic-a, vjerojatno ste opazili da sva svojstva nisu i za itanje i za pisanje. Na
primjer, nemoete modificirati MultiSelect svojstvo ListBox kontrole za vrijeme izvravanja programa kao
to ne moete modificirati visinu ComboBox kontrole za vrijeme kreiranja programa.

Poglavlje 10
Zavisno o prirodi vae klase mogu postojati dobri razlozi za limitiranjem pristupa vaim svojstvima, inei
ih samo za itanje ili manje uestalo samo za pisanje.
Recimo da elimo dodati svojstvo PersonAge naoj klasi. Ovo svojstvo ovisi o prije definiranim BirthDate
svojstvu, tako da ono mora biti samo za itanje.
U Visual Basicu svojstvo postaje samo za itanje kada mu se izostavi Property Let procedura:
Property Get PersonAge() As Integer
PersonAge = Year(Now) - Year(BirthDate)
End Property
Pokuaj prosljeivanja vrijednosti ovom svojstvu, npr. person.PersonAge = 30, rezultira podizanjem
pogreke.
SVOJSTVA SAMO ZA PISANJE (Write-only properties)
Moda e te imati potrebu kreirati svojstvo samo za pisanje. Tipian primjer je svojstvo Password kojeg
izlae neki imaginarni LoginDialog objekt. Svojstvu se moe prosljediti vrijednost radi validacije procesa
logiranja ali nesmije biti itljivo da se ne narui sigurnost same aplikacije. U Visual Basic-u, takvo svojstvo
se moe jednostavno implementirati ukljuivanjem Property Let procedure a izostavljanjem odgovarajue
Property Get procedure.
Private m_strPassword As String
Property Let Password(ByVal newValue As String)
Validate the password, raise error if not valid.
...
If all is OK, assign to Private member variable.
m_strPassword = newValue
End Property

SVOJSTVA U KOJA SE ZAPISUJE SAMO JEDNOM A OITAVA VIE


(write once/read-many properties)
Ovo svojstvo je mnogo interesantnije nego isto svojstvo samo za zapisivanje. Na primjer, imaginarni
LoginDialog object spominjan u prethodnom paragrafu moe izloiti UserName svojstvo ovog tipa. Jednom
kada se korisnik logira, programski kod pridruuje njeno ili njegovo ime ovom svojstvu i ostatak aplikacije
ga moe oitati ali ne i modificirati.
Ako imate klasu Invoice, svojstvo NumberInvoice mora biti prikazano kao svojstvo ovog tipa jer mijenjanje
jednom pridruenog broja rauna, moe izazvati ozbiljne probleme.
Visual Basic ne nudi ugraen system za implementaciju ovog svojstva, ali ga se moe simulirati sa par linija
koda.
Recimo da naoj klasi elimo dodati svojstvo SSN (Social Security Number; JMBG) koje je jedinstveni broj
za neku osobu, tako da moe biti postavljeno samo jednom a oitano po potrebi mnogo puta.
Prikazano je mogue rjeenje bazirano na statikoj lokalnoj varijabli:
Private m_lngSSN As Long
Public Property Get SSN() As Long
SSN = m_lngSSN
End Property
Public Property Let SSN(ByVal newValue As Long)
Static InitDone As Boolean
If InitDone Then Err.Raise 1002, , "Write-once property"
InitDone = True

Klase i objekti
m_lngSSN = newValue
End Property
Postoji i alternativnu rjeenje, koje zamjenjuje Static varijablu ali troi neto vie dodatne memorije (16
bytes umjesto 6):
Private m_vntSSN As Variant
Public Property Get SSN() As Long
SSN = m_vntSSN
End Property
Public Property Let SSN(ByVal newValue As Long)
If Not IsEmpty(m_vntSSN) Then Err.Raise 1002, , "Write-once_
property"
m_vntSSN = newValue
End Property
U oba primjera suelje koje klasa izlae je isto (SSN je Long svojstvo). Ovo je dobar primjer kako dobro
napravljeno ahurenje omoguava razliitu implementaciju unutar klase bez tetnog utjecaja na vanjski kod
koji koristi objekte stvorene iz te klase.

SVOJSTVA SA ARGUMENTIMA
Primjeri procedura svojstava koji su dosada prikazani su jednostavni, bez argumenata.
Meutim, Visual Basic omoguuje kreiranje procedura svojstava sa viestrukim argumentima, ak i
neobaveznim argumentima. Ovaj koncept Visual Basic koristi i za svoje kontrole, na primjer, svojstvo List
od ListBox kontrole prihvaa numerike indekse.
Kada koristite viestruke argumente, argumenti para procedura (potprograma) svojstava moraju se
podudarati.
Pogledajmo kako se ovaj koncept moe iskoristiti u naoj klasi CPerson. Pretpostavimo da trebamo svojstvo
PersonNotes, ali ga ne elimo ograniiti na samo jednu liniju.
Prva solucija koja moe pasti na pamet je da upotrijebimo niz stringova.
Ako deklariramo javni niz u klasnom modulu na sljedei nain:
Public PersonNotes(1 To 3) As String
kompajler se pojavljuje sa sljedeom porukom, "Constants, fixed-length strings, arrays, user-defined
types, and Declare statements not allowed as Public member of object modules".
Moemo kreirati privatni niz i izloiti ga prema vani preko para procedura svojstava:
Private m_strPersonNotes(1 To 3) As String
Property Get PersonNotes(Index As Integer) As String
PersonNotes = m_strPersonNotes (Index)
End Property
Property Let PersonNotes(Index As Integer, ByVal newValue As String)
If Index < LBound(m_strPersonNotes) Or Index_
UBound(m_strPersonNotes) Then Err.Raise 9
m_strPersonNotes(Index) = newValue
End Property
Poto Visual Basic sam provjerava granice niza te javlja greku u sluaju neispravnosti, mogli bismo izbaciti
dodatnu provjeru Index argumenta. Meutim, ako prilikom kompajliranja odluimo optimizirati na kod
odabirom opcije Remove Array Bounds Checks tada e naa dodatna provjera biti jedina provjera argumenta
granice niza.

Poglavlje 10
Sada moete pridruiti i dohvatiti do 3 razliite biljeke za istu osobu:
person.PersonNotes(1)=She likes listen Eminem.
person.PersonNotes(2)=She drives Porsche.
Print person.PersonNotes(1)
Moemo poboljati mehanizam postavljajui argument Index kao opcijski sa podrazumijevanom vrijednou
koja je jednaka prvom lanu niza:
Property Get PersonNotes(Optional Index As Integer = 1) As String
PersonNotes = m_strPersonNotes (Index)
End Property
Property Let PersonNotes(Optional Index As Integer = 1, _
ByVal newValue As String)
If Index < LBound(m_strPersonNotes) Or Index_
UBound(m_strPersonNotes) Then Err.Raise 9
m_strPersonNotes(Index) = newValue
End Property
U kodu klijenta, moete izostaviti indeks za podrazumijevanu biljeku.
person.PersonNotes = "She likes listen Eminem."
Koritenjem For-Next petlje moete ispisati sve tri biljeke.
For i = 1 To 3
Print person.PersonNotes(i)
Next
Mogu se koristiti i Variant argumenti, kao i IsMissing funkcija.
SVOJSTVA NABRAJANJA (Enumerated properties)
Nabrajanje prua prikladan nain za rad s nizovima povezanih konstanti te povezivanje vrijednosti konstanti
s imenima. Nabrajanje se ostvaruje koritenjem naredbe Enum u deklaracijskoj sekciji javnog modula klase.
Na primjer, u nau klasu moemo ukljuiti svojstvo PersonMaritalStatus kojem moe biti pridruena jedna
od unaprijed poznatih vrijednosti: 1 (NotMarried), 2 (Married), 3 (Divorced), 4 (Widowed). Enum struktura
nije nita drugo nego skup povezanih konstantnih vrijednosti koje automatski poprimaju razliite
vrijednosti:
In the declaration section of the class
Enum MaritalStatusConstants
NotMarried = 1
Married
Divorced
Widowed
End Enum
Podrazumijevano, prva konstanta u nabrajanju zapoinje sa vrijednou 0 te je nebi trebalo ni navoditi, a
sljedee se poveavaju za vrijednost jedan veom od prethodne konstante. Moete dodijeliti konstantama
bilo koju vrijednost drugog cijelog broja, ukljuujui i negativne brojeve.
Tako je u prethodnom primjeru, vrijednosti Married dodijeljena vrijednost 2, Divorced 3, Widowed 4. Sa
ovako odreenim nabrajanjem moete kreirati i javno svojstvo:
Private m_msMaritalStatus As MaritalStatusConstants
Property Get MaritalStatus() As MaritalStatusConstants

10

Klase i objekti
MaritalStatus = m_msMaritalStatus
End Property
Property Let MaritalStatus(ByVal newValue As MaritalStatusConstants)
If newValue <= 0 Or newValue > Widowed Then Err.Raise 5
m_msMaritalStatus = newValue
End Property
Podebljana linija koda onemoguava koritenje vrijednosti koje nisu definirane.
Kada u kodnom prozoru upisujete liniju programskog koda ovog primjera, Visual Basic automatski
prikazuje konstante nabrajanja.

Postoji nekoliko detalja o kojima treba voditi rauna pri radu sa Enum vrijednostima:

Visual Basic ureuje vrijednosti konstanti u nabrajanju kao duge cijele brojeve (Long).

Enum blokovi mogu biti javni ili privatni unutar klase. Privatna Enum struktura se rijetko koristi jer
se ne moe koristiti za argument ili povratnu vrijednost javnog svojstva ili metode. Ako je klasa
sama po sebi javna, u na primjer ActiveX EXE ili DLL projektu, programeri koji je koriste mogu
ukljuiti javnu konstantu iz Enum structure u svoj programski kod.
Nije nuno da Enum blok bude fiziki lociran unutar istog klasnog modula koji ga koristi ali je
nuno da svi Enum blokovi koje mislimo pozvati iz nae klase budu definirani kao javni (Public) u
jednako tako javnim (Public) klasama. U suprotnom e nam se javiti greka prilikom kompajliranja
kao na donjoj slici.

Sve nabrojane konstante unutar Enum bloka moraju imati jedinstveno ime u njihovom opsegu
djelovanja. Poto su Enum structure tipino javne, njihov opseg je cijela aplikacija.

Dodavanjem prefiksa nabrojanim konstantama kako bi se osigurala jedinstvenost imena,


Enum MaritalStatusConstants
msNotMarried = 1
msMarried
msDivorced
msWidowed
End Enum

11

Poglavlje 10

moe se izbjei sljedea pogreka: "Ambiguous name detected: <itemname>" .


Drugi nain postizanja istog cilja je navoenje kompletne sintakse enumblockname.constantname kao u
sljedeem primjeru:
person.MaritalStatus = MaritalStatusConstants.msMarried
Enum vrijednosti ne moraju biti u uzlaznom slijedu. Moete osigurati specijalne vrijednosti izvan
oekivanih kako bi signalizirali neka posebna stanja, kao u sljedeem primjeru koda neke zamiljene klase:
Enum InvoiceStatusConstants
isEditing = 1
isInserted
isError = -1111
End Enum
Jo jedan primjer nabrojenih svojstava ije vrijednosti nisu u slijedu su takozvana bit-fielded svojstva, kao u
sljedeem kodu:
Enum FileAttributeConstants
faNormal = 0 Actually means "no bit set"
faReadOnly = 1 Bit 0
faHidden = 2 Bit 1
faSystem = 4 Bit 2
faDirectory = 16 Bit 3
faArchive = 32 Bit 4
End Enum
Kao to vidimo pomou nabrojenih svojstava moemo pohraniti neke opisne informacije u samo 4 bajta
memorije.
esto je korisno klasama dodati svojstvo samo za itanje koje vraa tekstualni opis nabrojenih konstanti.
Property Get MaritalStatusDescr() As String
Select Case m_strMaritalStatus
Case msNotMarried: MaritalStatusDescr = "NotMarried"
Case msMarried: MaritalStatusDescr = "Married"
Case msDivorced: MaritalStatusDescr = "Divorced"
Case msWidowed
If Sex = Male Then
MaritalStatusDescr = "Widower"
ElseIf Sex = Female Then
MaritalStatusDescr = "Widow"
End If
Case Else
Err.Raise 5
End Select
End Property
Varijabli m_MaritalStatus nemoe biti pridruena niti jedna vrijednost izvan definiranog ranga jer je
zatiena Property Let MaritalStatus procedurom.
Meutim, uvijek trebate voditi rauna da je klasa entitet u razvoju i ono to je danas definirano sutra moda
treba proiriti. to e se desiti ako odluimo dodati petu MeritalStatus konstantu? Mogue je da validacijski
kod koji smo koristili za testiranje ispravnog ranga postane zastarijel.
Upravo zato smo koristili Case Else blok (prikazan podebljano nakoeno) kroz koji testiramo sve vrijednosti
i odbacujemo one koje nisu definirane. Ovaj koncept je poznat kao defenzivno programiranje.

12

Klase i objekti
Koritenjem jednostavnih trikova mogue je sigurno dodati nove konstante bez modificiranja validacijskog
koda u pripadajuoj Property Let proceduri.
Enum MaritalStatusConstants
msNotMarried = 1
msMarried
msDivorced
msWidowed
MARITALSTATUS_MAX = Widowed
End Enum
Property Let MaritalStatus(ByVal newValue As MaritalStatusConstants)
If newValue <= 0 Or newValue > MARITALSTATUS_MAX Then Err.Raise 5
m_msMaritalStatus = newValue
End Property
Kada dodajete konstante u Enum blok, dovoljno je podesiti MARITALSTATUS_MAX konstantu
na novu, veu vrijednost.
SVOJSTVA KOJA VRAAJU OBJEKTE
Objekti Visual Basica mogu izloiti svojstva koja vraaju objekt. Na primjer, forme i sve vidljive kontrole
izlau svojstvo Font, koje vraa objekt Font:
Form1.Font.Bold=True
Ono to Visual Basic moe sa svojim objektima omogueno je i vama sa vaim klasama to daje velike
mogunosti u pisanju objektno-orijentiranih programa. Na primjer, vaoj CPerson klasi nedostaje svojstvo
Address
?''''''''?????????
POSTUPCI (METODE) KLASE
Postupci klase su ubiti javni potprogrami tipa Sub ili Function. Kao i u drugim tipovima modula, jedina
razlika izmeu njih je u tome to Function postupak vraa vrijednost dok Sub postupak to ne ini.
Prvi postupak koji emo ukljuiti u nau klasu je CompleteName, koji slui za dobivanje kompletnog imena
osobe.
Proceduralni (neobjektni) nain razmiljanja rijeava ovaj jednostavni zahtjev kreiranjem funkcije u javnom
BAS modulu:
Function CompleteName(person As CPerson) As String
CompleteName = person.FirstName & " " & person.LastName
End Function
Iako ovaj kod savreno radi, to nije najelegantniji put rijeenja naeg upita s aspekta ponovne iskoristivosti
nae klase, jer je njena inteligencija razbacana svuda po aplikaciji.
Najbolji pristup je dodavanja nove metode samoj klasi:
Function CompleteName() As String
CompleteName = FirstName & " " & LastName
End Function
Dok ste unutar klase, nemorate navoditi sintaksu koja se odnosi na pripadnost svojstva tekuoj instanci
klase. S druge strane, iako ste unutar klase a pozivate javno ime svojstva (FirstName) umjesto odgovarajuu
privatnu varijablu (m_FirstName), Visual Basic izvrava Property Get proceduru kao da je svojstvo pozvano
izvan klase.
Uvijek pozivajte privatne varijable klase jedino preko Property Let/Get procedura.

13

Poglavlje 10
Ako poslje modificirate interno ureenje (implementaciju) klase, morate mijenjati samo mali dio koda
unutar klasnog modula.
Javno suelje klase je definirano odreivanjem svojstava i postupaka u modulu klase.
Potpogrami koje odredite kao privatne (sa opsegom unutar klase) nisu dio suelja. To znai da moete
pronijeniti uslune potprograme koji se koriste unutar modula klase, bez utjecaja na programski kod koji
koristi objekte. Takoer, moete mijenjati programski kod unutar javnih potprograma tipa Sub ili Function
koji ostvaruju postupak, bez utjecaja na kod koji koristi postupak.
Sve dok nepromijenite tipove podataka za argumente potprograma, ili tipove podataka koji se vraaju
potprogramom tipa Function, suelje je nepromijenjeno.
Skrivanje detalja ostvarivanja objekta iza suelja je jedan vid ahurenja.
Sve metode i sva svojstva koja dodamo klasi su neposredno vidljiva u Object Browser-u, zajedno sa
pripadajuom kompletnom sintaksom.

DOGAAJ Initialize
U mnogim sluajevima ve prilikom stvaranja objekta imate potrebu pridruiti mu unaprijed definirane
vrijednosti u svojstva bez zasebnog navoenja u kodu pozivatelja.
Na primjer, ako upisujete nacionalnu pripadnost osobe za pretpostaviti je da e vrijednost Citizenship
svojstva biti Hrvatsko.
Podrazumijevane (default) vrijednosti mogu biti pridruene prilikom kreiranja objekta, navoenjem par
linija koda u Class_Initialize dogaaj klasnog modula.
Private m_strCitizenship As String
Property Get Citizenship() As String
Citizenship = m_strCitizenship
End Property
Property Let Citizenship(ByVal newValue As String)
m_strCitizenship = newValue
End Property
Private Sub Class_Initialize()
m_Citizenship = "Hrvatsko"
End Sub
Ako sada pratite izvravanje programa iz naredbe u naredbu, vidjet ete da neposredno nakon to Visual
Basic kreira object (Set naredba u modulu forme) okida dogaaj Class_Initialize te se object vraa
pozivatelju sa svim svojstvima ispravno inicijaliziranim.
Potprogram dogaaja Initialize sadri onaj programski kod koji treba biti izveden u trenutku kada je stvoren
object. Suprotno, dogaaj Terminate sadri bilo koji programski kod koji se treba izvesti za ienje nakon
to je object uniten.
KLJUNA RIJE Me
Ponekad klasa moe vriti upuivanje na samu sebe to se ini koritenjem kljune rijei Me.
U sljedeem primjeru je prikazan par rutina ope namjene koje su smjetene u BAS modul a slue praenju
dva stanja objekta, kada je kreiran i kada je uniten.
Sub TraceInitialize (object As Object)
Debug.Print "Created a " & TypeName(object) _

14

Klase i objekti
& " object at time " & Time$
End Sub
Sub TraceTerminate (obj As Object)
Debug.Print "Destroyed a " & TypeName(object) _
& " object at time " & Time$
End Sub
Sljedeim linijama koda u klasnom modulu implementiramo gornje rutine.
Private Sub Class_Initialize()
TraceInitialize Me
End Sub
Private Sub Class_Terminate()
TraceTerminate Me
End Sub

15

Poglavlje 10
UNUTARNJI IVOT OBJEKATA
Sada kada posjedujete solidno znanje o tome kako se organizira i ureuje modul klase te kako svojstva i
metode zapravo rade, pogledajmo neto poblie u intimu objekata u Visual Basicu.
Na sljedeoj slici je prikazano kako su objekti razloeni u memoriji. U primjeru se koriste dvije varijable, P1
i P2, koje imaju pokazivanje na jednu instancu CPerson klase te varijabla P3 koja ima pokazivanje na
razliitu instancu iste klase. Svaki put kada Visual Basic kreira novu instancu klase, on dodijeljuje odvojeno
memorijsko podruje (instance data area). Struktura i veliina tog prostora je fiksna za neku klasu i ovisi o
tome koliko svojstava klasa izlae.

p1

VTable pointer
Reference
Counter=2

p2

(ostali interni podaci)

Podruje podataka
m_lngSSN="123456789"
m_strFirstName="Ana"
m_strLastName="Zuljev"
m_dtBirthDate="11.06.01"
...

p3

VTable pointer
Reference
Counter=1

(ostali interni podaci)

Podruje podataka
m_lngSSN="123477777"
m_strFirstName="Paolo"
m_strLastName="Ivic"
m_dtBirthDate="..."
...

16

VTable pointer
Get SSN
...

Let SSN

m_strLastName="Zuic"
Get FirstName
m_dtBirthDate="..."
m_strLastName="Zuic"
...
Let FirstName
m_dtBirthDate="..."
m_strLastName="Zuic"
...
Get LastName
m_dtBirthDate="..."
m_strLastName="Zuic"
...
Let LastName
m_dtBirthDate="..."
m_strLastName="Zuic"
...
Get BirthDate
m_dtBirthDate="..."
m_strLastName="Zuic"
...
Let BirthDate
m_dtBirthDate="..."
m_strLastName="Zuic"
...
...
m_dtBirthDate="..."
m_strLastName="Zuic"
...
CompleteName
m_dtBirthDate="..."
m_strLastName="Zuic"
...
...
m_dtBirthDate="..."
m_strLastName="Zuic"
...
m_dtBirthDate="..."
...

Klase i objekti
Prvo pravilo za ivotni vijek objekta je jednostavno: objekt je uniten kad je i posljednji pokaziva na njega
otputen. Broja pokazivaa (reference counter) je memorijska lokacija od 4-byta koja pamti broj objektnih
varijabli koje imaju pokazivanje na odreeni instantni blok podataka.
U primjeru sa prethodne slike, objekt Ana Zuvelj ima broja pokazivaa jednak 2 a objekt Paolo Ivic ima
broj pokazivaa jednak 1.
Vrijednost brojaa pokazivaa nikako nemoe biti jednaka 0 jer bi to znailo da nepostoji nijedna objektna
varijabla koja ima pokazivanje na taj objekt to znai trenutno unitavanje objekta.
Broja pokazivaa je apstraktna varijabla jer se nemoe ni oitati ni mijenjati. Njegova vrijednost se moe
indirektno poveavati i smanjivati jedino koritenjem naredbe Set.
Set
Set
Set
Set

p1
p2
p1
p2

=
=
=
=

New CPerson
p1
Nothing
Nothing

Prva linija koda gornjeg primjera kreira objekt iz klase CPerson i postavlja broja pokazivaa na 1. Druga
linija koda poveava broja pokazivaa na 2. Trea linija koda smanjuje broja na 1, a posljednja linija ima
za posljedicu unitavanje objekta jer ne postoji ni jedna objektna varijabla koja ima pokazivanje na taj
objekt.
Na kraju instantnog bloka podataka se nalaze vrijednosti svih varijabli modula klase, ukljuujui sve
varijable na nivou modula i statitike varijable u procedurama ali iskljuujui dinamike lokalne varijable
koje se pohranjuju u stog za vrijeme svakog poziva.
Druga vana informacija u instantnom bloku podataka je VTable pokaziva (VTable pointer). To je 32-bitna
(4-byta) memorijska lokacija na vrhu instantnog bloka podataka koja ima pokazivanje na drugo memorijsko
podruje nazvano VTable. Svi objekti koji pripadaju istoj klasi imaju i isto VTable podruje.
VTable je ubiti malena struktura koja opisuje ponaanje klase. Ne predstavlja nita drugo nego niz
pokazivaa na stvarni kompajlirani kod. Svaki pokaziva odgovara jednoj metodi ili svojstvu unutar
kompajliranog koda.
Svojstva za itanje i pisanje imaju dva razliita ulaza u VTable, dok svojstva tipa Variant mogu imati i tri
ulaza ako ukljuuji i Set naredbu.
VTable struktura se dinamiki kreira za vrijeme izvravanja programa jer je nemogue za vrijeme
kompajliranja koda znati gdje e aplikacija pronai slobodni memorijski blok u kojega e uitati
kompajlirani kod.
Adresa svake kompajlirane rutine je poznata tek u vrijeme izvravanja programa.
STVARANJE OBJEKTA
Kada Visual Basic prvi put kreira objekt iz neke klase za vrijeme izvravanja programa, on zapravo ini
sljedee sekvence:
1. Dodijeljuje slobodno memorijsko podruje kompajliranom kodu koji je generiran iz klase i uitava
kod sa diska.
2. Dodijeljuje maleni memorijski blok za VTable i popunjava ga sa adresama svake javne rutine iz
klasnog modula.
3. Dodijeljuje memorijski blok sa svaku pojedinu objektnu instancu i postavlja 32-bitnu vrijednost
koja ima pokazivanje na VTable. U okviru ove sekvence, Visual Basic okida i Class_Initialize
proceduru kako bi se varijable unutar objekta korektno inicijalizirale.
4. Pohranjuje adresu instantnog podruja podataka u objektnu varijablu (u naem primjeru p1,p2 i
p3), te u tom trenutku klijent moe raditi sa objektom sve ono to mu on prua.
Ove sekvence se izvravaju jedino pri prvom kreiranju objekta iz dane klase kompajliranog koda. Za sve
slijedee objekte iz iste klase, koraci 1 i 2 se preskau jer je VTable ve uitana u memoriju.
Kada jednostavno pridruite objektnu varijablu koritenjem naredbe Set bez rijei New, korak 3 se takoer
preskae te se ustvari dodijeljuje samo 32-bitna vrijednost (korak 4).
TIPOVI POVEZIVANJA
Tip povezivanja odreuje brzinu kojom e se pristupati postupcima objekta koritenjem varijable objekta.
Varijabla objekta moe biti kasno povezana (late bound, najsporije), ili rano povezana (early bound).
Rano povezane varijable mogu biti povezane nainom DispID ili povezane nainom VTable (najbre).

17

Poglavlje 10
Rano VTable povezivanje (early VTable binding) je proces koji je kompletiran jo za vrijeme kompajliranja i
predstavlja najbri nain povezivanja. Kompajler proizvodi 'kopiju' VTable koja se potom efikasno koristi za
vrijeme izvravanja programa pri pristupu svojstvima i metodama objekta.
Povezivanje na ovaj nain se koristi kada imamo varijable unapred poznatog tipa.
Kasno povezivanje (late binding) se odvija pri deklaraciji objektne varijable kao As Object ili As Variant,
odnosno kada kompajler nemoe zakljuiti kakav tip objekta e biti sadran u toj objektnoj varijabli.
Proces povezivanja na ovaj nain se kompletira za vrijeme izvoenja programa i izvodi pri svakom
upuivanju na objekt.
Ovakav nain povezivanja uzima mnogo vremena i predstavlja najsporiji nain povezivanja. Ovaj nain se
moe koristiti za upuivanje na one objekte za koje se zna da se rijetko koriste u aplikaciji.
Trei nain povezivanja rano nainom DispID (early ID binding) pada izmeu prethodna dva. Kompajler
nemoe kreirati 'kopiju' VTable ali moe provjeriti koja svojstva i metode su tamo, te pohranjuje specijalnu
ID vrijednost u izvrni kod. Za vrijeme izvravanja programa, Visual Basic koristi taj ID za brzi pregled u
popis objektovih svojstava i metoda.
Ovaj nain se koristi za neke vanjske objekte, na primjer ActiveX kontrole, koje moe koristiti vaa
aplikacija.
Jednostavno pravilo bi bilo: koristite rano povezivanje u vaem kodu kad god je to mogue.
Pristup svojstvu koritenjem kasnog povezivanja moe biti i do 200 puta sporiji od pristupa istom svojstvu
sa mnogo efikasnijim ranim VTable povezivanjem. Normalno, to je aplikacija sloenija ta razlika e biti
manja jer nain povezivanja utjee samo na vrijeme pozivanja procedure ali ne i na vrijeme izvravanja
koda unutar procedure.
Nainom pisanja koda direktno utjeete na izbor izmeu ranog i kasnog povezivanja, ali ne i na koji oblik
ranog povezivanja e izabrati Visual Basic.
Ako je objekt definiran unutar vae aplikacije ili ako njegova biblioteka moe predati informacije o strukturi
njegove VTable, Visual Basic e povezivanje ostvariti na VTable nain. U protivnom, koristi sporiji oblik
ranog povezivanja DispID.
PREGLED KLJUNIH RIJEI OBJEKTA
Kljuna rije New
Kada se koristi u kombinaciji sa naredbom Set kreira novu instancu dane klase, vraajui memorijsku adresu
dodijeljenog prostora instantnom bloku podataka.
Naredba Set
Naredba Set jednostavno kopira sve to se nalazi s desne strane znaka jednakosti u objektnu varijablu koja
se nalazi s lijeve strane znaka jednakosti.
Ta vrijednost moe biti rezultat koritenja kljune rijei New, sadraj neke druge objektne varijable koja ve
postoji ili rezultat nekog izraza koji se razvija u objekt. Jedini drugi zadatak koji ova naredba izvrava je
poveanje brojaa pokazivaa za dano instantno podruje podataka ali i smanjivanje istoga kada objektna
varijabla ne sadri vrijednost Nothing.
Sljedea linija koda kreira objekt i pohranjuje njegovu adrese u objektnu varijabli.
Set P1 = New CPerson
Na ovaj nain samo se kopira memorijska adresa iz objektne varijable p1 u objektnu varijablu p2.
Set p2 = p1
Objektna varijabla p2 sadri pokaziva na novi objekt ali i smanjuje broja pokazivaa originalnog objekta.
Set p2 = New CPerson
Vrijednost Nothing
Navoenje kljune rijei Nothing je nain memoriranja Null vrijednosti ili 0 u objektnoj varijabli.

18

Klase i objekti

Sljedea linija koda smanjuje broja upuivanja instantnog bloka podataka te pohranjuje 0 u objektnu
varijablu p1 odspajajui je od instance objekta. Ako je to bila ujedno i jedina objektna varijabla s
pokazivanjem na instancu, Visual Basic oslobaa i instancu.
Set p1 = Nothing
Operator Is
Operator Is se koristi za provjeravanje dali dvije objektne varijable imaju pokazivanje na isti instantni blok
podataka. Visual Basic usporeuje adrese koje su pohranjene u objektnim varijablama i vraa True u sluaju
podudaranja.
Koritenjem IsNothing testa, Visual Basic usporeuje sadraj varijable sa vrijednou 0.
If p1 Is p2 Then Print "p1 i p2 upuuju na isti objekt CPeron"
Znak jednakosti u ovom sluaju ima potpuno drugo znaenje i rezultirao bi usporedbom podrazumijevanih
svojstava objekta.
If p1 = p2 Then Print "Ime p1 i p2 je isto"

19

You might also like