You are on page 1of 16

autor:

Marko Petrievi, dipl.ing., prof.


urednica:

Silvija Jurak, prof.


naslov:

Objektno orijentirano programiranje


struni recezenti:

Danijel Kuak, dipl.ing


Ivan Mesic
lektorica:

Dijana Stilinovi, prof.


grafiki urednik:

Kreimir Pletikosa, ACE


nakladnik:

Algebra d.o.o., 2009.


za nakladnika:

mr.sc. Mislav Balkovi


mjesto i godina izdavanja:

Zagreb, 2009

Sva prava pridrana. Niti jedan dio ove


knjige ne smije se reproducirati ili prenositi
u bilo kojem obliku, niti na koji nain.
Zabranjeno je svako kopiranje, citiranje te
upotreba knjige u javnim i privatnim
edukacijskim organizacijama u svrhu
organiziranih kolovanja, a bez pisanog
odobrenja nositelja autorskih prava.
Copyright Algebra d.o.o.
CIP zapis dostupan u raunalnom katalogu
Nacionalne i sveuiline knjinice u Zagrebu
pod brojem xxxxxx

ISBN 978-953-7390-53-2

autor:

Marko Petrievi, dipl.ing., prof.


urednica:

Silvija Jurak, prof.


naslov:

Objektno orijentirano programiranje


struni recezenti:

Danijel Kuak, dipl.ing


Ivan Mesic
lektorica:

Dijana Stilinovi, prof.


grafiki urednik:

Kreimir Pletikosa, ACE


nakladnik:

Algebra d.o.o., 2009.


za nakladnika:

mr.sc. Mislav Balkovi


mjesto i godina izdavanja:

Zagreb, 2009

Sva prava pridrana. Niti jedan dio ove


knjige ne smije se reproducirati ili prenositi
u bilo kojem obliku, niti na koji nain.
Zabranjeno je svako kopiranje, citiranje te
upotreba knjige u javnim i privatnim
edukacijskim organizacijama u svrhu
organiziranih kolovanja, a bez pisanog
odobrenja nositelja autorskih prava.
Copyright Algebra d.o.o.
CIP zapis dostupan u raunalnom katalogu
Nacionalne i sveuiline knjinice u Zagrebu
pod brojem 715230

ISBN 978-953-7390-53-2

Sadraj:
1. Poglavlje: .......... Uvod ...................................................................................................................................................................... 5
1.1. Uvod 6
1.2. Osnovni principi ........................................................................................................................................................................... 7
1.3. Objektno orijentirano programiranje i programski jezik C# ........................................................................................................... 8
1.4. "Hello World!" ............................................................................................................................................................................ 10
1.4.1. Primjer program "Hello World" u programskom jeziku C# .............................................................................................. 10
1.4.2. Razlikovanje velikih i malih slova...................................................................................................................................... 10
1.4.3. Prazan prostor ................................................................................................................................................................. 10
1.4.4. Tipovi, klase ..................................................................................................................................................................... 10
1.4.5. Metode ............................................................................................................................................................................. 11
1.4.6. Kljuna rije static ......................................................................................................................................................... 11
1.4.7. Komentari......................................................................................................................................................................... 11
1.4.8. Konzolni programi ............................................................................................................................................................ 11
1.4.9. Operator toka (.) ............................................................................................................................................................. 12
1.4.10. Imenski prostori .............................................................................................................................................................. 12
1.4.11. Pokretanje programa ...................................................................................................................................................... 12
1.4.12. Kljuna rije using ......................................................................................................................................................... 14
1.4.13. Kljuna rije namespace ................................................................................................................................................. 15
1.4.14. Parametri metode Main (string[] args) ............................................................................................................................ 15
2. Poglavlje: .......... Osnove programskog jezika C#......................................................................................................................... 17
2.1. Tipovi 18
2.1.1
Ugraeni tipovi .......................................................................................................................................................... 18
2.2. Varijable i konstante .................................................................................................................................................................. 21
2.2.1. Varijable ........................................................................................................................................................................... 21
2.2.2.Obavezna deklaracija i inicijalizacija .................................................................................................................................. 22
2.2.3. Konstante ......................................................................................................................................................................... 23
2.2.4. Enumeracije ..................................................................................................................................................................... 24
2.2.5. Nizovi znakova tip podataka string ............................................................................................................................. 26
2.3. Iskazi 27
2.3.1. Blokovi iskaza .................................................................................................................................................................. 27
2.3.2. Izrazi ................................................................................................................................................................................ 27
2.3.3. Iskazi bezuvjetnog grananja ............................................................................................................................................. 28
2.3.4. Iskazi uvjetnog grananja ................................................................................................................................................... 30
2.3.5. Iskazi switch: alternativa ugnijeenim iskazima if .......................................................................................................... 33
2.3.6. Iteracijski iskazi ................................................................................................................................................................ 35
2.4. Operatori ................................................................................................................................................................................... 40
2.4.1. Operator pridruivanja ...................................................................................................................................................... 40
2.4.2. Matematiki operatori ....................................................................................................................................................... 40
2.4.3. Operatori za uveavanje i umanjivanje ............................................................................................................................. 42
2.4.4. Relacijski operatori ........................................................................................................................................................... 45
2.4.5. Logiki operatori ............................................................................................................................................................... 46
2.4.6. Prednost operatora .......................................................................................................................................................... 46
2.4.7. Ternarni operator ............................................................................................................................................................. 47
3. Poglavlje: .......... Klase i objekti ..................................................................................................................................................... 49
3.1. Klase i objekti ............................................................................................................................................................................ 50
3.1.1. Deklariranje i definiranje klase .......................................................................................................................................... 50
3.1.2. Modifikatori pristupa ......................................................................................................................................................... 51
3.1.3. Instanciranje (stvaranje) objekata ..................................................................................................................................... 52
3.1.4. Primjer deklaracije, definicije i instanciranja novog objekta klase ...................................................................................... 53
3.1.5. Konstruktori ...................................................................................................................................................................... 55
3.1.6. Inicijalizatori ..................................................................................................................................................................... 58
3.1.1
Kljuna rije this ...................................................................................................................................................... 58
3.1.8. Unitavanje objekata ........................................................................................................................................................ 59
3.2. Statiki lanovi i lanovi instance ............................................................................................................................................... 59
3.2.1. Pozivanje statikih lanova............................................................................................................................................... 60
3.2.2. Statike metode za pristup statikim poljima .................................................................................................................... 62
3.2.3. Koritenje statikog konstruktora ...................................................................................................................................... 62
3.2.4. Statike klase ................................................................................................................................................................... 62
3.3. Metode ...................................................................................................................................................................................... 63
3.3.1. Prosljeivanje parametara ................................................................................................................................................ 64
3.3.2. Preoptereivanje metoda i konstruktora ........................................................................................................................... 66
3.4. Svojstva .................................................................................................................................................................................... 69
3.4.1. Koritenje svojstava ......................................................................................................................................................... 69
3.4.2. Pristupnik get ................................................................................................................................................................... 70
3.4.3. Pristupnik set ................................................................................................................................................................... 71
3.4.4. Readonly i writeonly svojstva ........................................................................................................................................... 72
3.4.5. Polja readonly .................................................................................................................................................................. 73
4. Poglavlje: .......... Nasljeivanje i polimorfizam .............................................................................................................................. 75
4.1. Nasljeivanje i polimorfizam ...................................................................................................................................................... 76
4.1.1. Specijalizacija i generalizacija .......................................................................................................................................... 76
4.1.2. Nasljeivanje .................................................................................................................................................................... 77

4.1.3. Polimorfizam .................................................................................................................................................................... 77


4.1.4. Primjer koritenja nasljeivanja i polimorfizma.................................................................................................................. 78
4.1.5. Stvaranje polimorfnih tipova ............................................................................................................................................. 80
4.1.6. Pozivanje konstruktora osnovne (bazne) klase ................................................................................................................. 81
4.1.7. Kontrola pristupa .............................................................................................................................................................. 82
4.1.8. Koritenje kljunih rijei new i override u praenju inaica .............................................................................................. 83
4.2. Apstraktne klase ........................................................................................................................................................................ 83
4.2.1. Primjer koritenja apstraktne klase ................................................................................................................................... 84
4.2.2. Zapeaena (sealed) klasa ............................................................................................................................................. 85
4.3. Korijen svih klasa: Object ......................................................................................................................................................... 86
4.3.1. Primjer upotrebe metode ToString() naslijeene iz Object ........................................................................................... 86
4.4. Pakiranje i raspakiravanje tipova ............................................................................................................................................... 88
4.4.1. Primjer boxinga i unboxinga ............................................................................................................................................. 89
4.5. Ugnjeivanje klasa .................................................................................................................................................................. 90
4.5.1. Primjer koritenja ugnijeene klase ................................................................................................................................ 91
5. Poglavlje: .......... Preoptereivanje operatora ............................................................................................................................... 93
5.1. Preoptereivanje operatora ....................................................................................................................................................... 94
5.1.1. Preoptereivanje operatora .............................................................................................................................................. 94
5.1.2. Podrka ostalim .NET jezicima ......................................................................................................................................... 94
5.1.1. Umjerenost u koritenju operatora .................................................................................................................................... 95
5.1.4. Logiki parovi ................................................................................................................................................................... 95
5.1.5. Operator jednakosti .......................................................................................................................................................... 95
5.1.6. Operatori pretvaranja ....................................................................................................................................................... 96
5.1.7. Primjer koritenja preoptereivanja operatora................................................................................................................... 96
6. Poglavlje: .......... Strukture ........................................................................................................................................................... 103
6.1. Strukture ................................................................................................................................................................................. 104
6.1.1. Definiranje struktura ....................................................................................................................................................... 104
6.1.2. U strukturi nema inicijalizatora ........................................................................................................................................ 106
6.1.3. Eksplicitno definirani konstruktor mora inicijalizirati varijable lanice............................................................................... 106
6.1.4. Strukture su vrijednosni, a klase referentni tipovi ............................................................................................................ 106
6.1.5. Implicitno nasljeivanje iz Object .................................................................................................................................. 107
6.1.6. Stvaranje struktura ......................................................................................................................................................... 108
7. Poglavlje: .......... Suelja............................................................................................................................................................... 111
7.1. Suelja .................................................................................................................................................................................... 112
7.1.1. Definiranje i implementiranje suelja .............................................................................................................................. 112
7.1.2. Pretvaranje u suelje ...................................................................................................................................................... 115
7.1.3. Pristupanje metodama suelja ....................................................................................................................................... 115
7.2. Implementiranje vie od jednog suelja ................................................................................................................................... 116
7.2.1. Proirivanje suelja ........................................................................................................................................................ 116
7.2.2. Kombiniranje suelja ...................................................................................................................................................... 116
7.2.3. Primjer proirivanja i kombiniranja suelja ...................................................................................................................... 117
7.2.4. Operator as .................................................................................................................................................................... 120
7.2.5. Pretvaranje u proirena i kombinirana suelja ................................................................................................................ 122
7.2.6. Operator is .................................................................................................................................................................... 122
7.2.7. Usporedba suelja s apstraktnom klasom ...................................................................................................................... 125
7.3. Premoivanje implementacije suelja .................................................................................................................................... 126
7.3.1. Primjer premoivanja implementacije suelja................................................................................................................ 126
7.4. Eksplicitna implementacija suelja........................................................................................................................................... 129
7.4.1. Primjer koritenja eksplicitne implementacije suelja ...................................................................................................... 129
7.4.2. Selektivno izlaganje metoda suelja ............................................................................................................................... 131
7.5. Pristupanje zapeaenim klasama i vrijednosnim tipovima ...................................................................................................... 131
7.5.1. Implementacija suelja kroz strukturu ............................................................................................................................. 132
8. Poglavlje: .......... Polja, indekseri i kolekcije ............................................................................................................................... 135
8.1. Polja, indekseri i kolekcije ........................................................................................................................................................ 136
8.2. Polja 136
8.2.1. Deklariranje polja ........................................................................................................................................................... 137
8.2.2. Podrazumijevane vrijednosti........................................................................................................................................... 139
8.2.3. Pristupanje elementima polja ......................................................................................................................................... 139
8.2.4. Primjer koritenja polja ................................................................................................................................................... 140
8.2.5. Iskaz foreach ................................................................................................................................................................ 141
8.2.6. Inicijaliziranje elemenata polja ........................................................................................................................................ 142
8.2.7. Kljuna rije params ....................................................................................................................................................... 143
8.2.8. Viedimenzionalna polja ................................................................................................................................................. 144
8.2.9. Postavljanje granica polja ............................................................................................................................................... 150
8.2.10. Pretvaranje polja .......................................................................................................................................................... 152
8.2.11. Sortiranje polja ............................................................................................................................................................. 153
8.3. Indekseri ................................................................................................................................................................................. 154
8.3.1. Primjer definiranja indeksera .......................................................................................................................................... 155
8.4. Suelja kolekcija ...................................................................................................................................................................... 158
8.4.1. Suelje IEnumerable<T> ............................................................................................................................................... 159
8.4.2. List<T> ......................................................................................................................................................................... 161
8.4.3. Implementiranje suelja IComparable ........................................................................................................................... 163

8.4.4. Implementacija suelja IComparer ................................................................................................................................. 165


8.4.5. Ogranienja.................................................................................................................................................................... 168
8.5. Redovi 171
8.5.1. Primjer koritenja klase Queue........................................................................................................................................ 172
8.6. Stogovi .................................................................................................................................................................................... 173
8.6.1. Primjer koritenja klase Stack........................................................................................................................................ 173
8.7. Rjenici ................................................................................................................................................................................... 175
8.7.1. IDictionary<K, V>...................................................................................................................................................... 176
8.7.2. Primjer koritenja klase Dictionary .............................................................................................................................. 176
9. Poglavlje: .......... Nizovi znakova .................................................................................................................................................. 179
9.2. Nizovi znakova ........................................................................................................................................................................ 180
9.1.1. Klasa String ................................................................................................................................................................. 180
9.1.2. Stvaranje nizova znakova............................................................................................................................................... 181
9.1.3. Metoda ToString()....................................................................................................................................................... 181
9.1.4. Metode i svojstva klase String ...................................................................................................................................... 182
9.1.5. Primjer rada s nizovima .................................................................................................................................................. 183
9.1.6. Traenje podnizova metoda Substring() .................................................................................................................. 187
9.1.7. Dijeljenje nizova metoda Split() ............................................................................................................................... 189
9.2. Rad s dinamikim nizovima ..................................................................................................................................................... 190
9.2.1. Klasa StringBuilder .................................................................................................................................................... 190
9.3. Regularni izrazi ....................................................................................................................................................................... 192
9.3.1. Klasa Regex ................................................................................................................................................................... 192
10. Poglavlje: ........ Obrada iznimaka ............................................................................................................................................... 195
10.1. Obrada iznimaka ................................................................................................................................................................... 196
10.1.1. Izbacivanje i hvatanje iznimaka iskazi throw i catch................................................................................................. 196
10.1.2. Namjenski catch iskazi ................................................................................................................................................ 200
10.1.3. Iskaz finally .............................................................................................................................................................. 201
10.2. Objekti klase Exception ....................................................................................................................................................... 204
10.2.1. Primjer koritenja objekta klase Exception.................................................................................................................. 204
10.2.2. Prilagoene iznimke ..................................................................................................................................................... 206
10.2.3. Ponovno izbacivanje iznimaka...................................................................................................................................... 208
11. Poglavlje: ........ Delegati i dogaaji ............................................................................................................................................ 213
11.1. Delegati i dogaaji ................................................................................................................................................................. 214
11.1.1. Delegati ........................................................................................................................................................................ 214
11.1.2. Primjer koritenja delegata ........................................................................................................................................... 215
11.1.3. Delegati i metode instance ........................................................................................................................................... 220
11.1.4. Statiki delegati ............................................................................................................................................................ 221
11.1.5. Delegati kao svojstva ................................................................................................................................................... 221
11.1.6. Vieodredini delegati .................................................................................................................................................. 222
11.2. Dogaaji ................................................................................................................................................................................ 225
11.2.1. Delegati i dogaaji ........................................................................................................................................................ 226
11.2.2. Primjer implementacije dogaaja s pomou delegata ................................................................................................... 227
11.2.3. Problemi u implementaciji dogaaja s pomou delegata............................................................................................... 231
11.2.4. Kljuna rije event ....................................................................................................................................................... 232
11.2.5. Anonimne metode ........................................................................................................................................................ 235

3. Poglavlje: Klase i objekti

U ovom poglavlju nauit ete:

Deklariranje i definiranje klase


Instanciranje objekata, konstruktori
Statike lanove i lanove instance
Metode
Svojstva

Str.50

3. POGLAVLJE: KLASE I OBJEKTI

3.1. Klase i objekti


U prethodnom poglavlju ukratko smo objasnili primitivne tipove koji su dio programskog jezika C#.
Meutim, bit C#-a je mogunost stvaranja novih, sloenih tipova, koje sami definiramo, a koji jasno
preslikavaju objekte od kojih se sastoji problem koji pokuavamo rijeiti.
Nove tipove u programskom jeziku C# zadajemo deklariranjem i definiranjem klasa. Kad je klasa
definirana, iz nje moemo instancirati (stvarati) objekte. Kaemo da je svaki objekt instanca neke
klase.
Na klase i objekte moemo analogno gledati kao na tipove i varijable. U tom kontekstu klasa je
zapravo tip objekta, a objekt je varijabla odreene klase.
Sjetimo se primjera osobe iz prvog poglavlja. Klasa Osoba definira osobine i ponaanja vana za
pojam osobe u naem programu. Objekti klase Osoba stvaraju se u memoriji prilikom izvoenja
programa. Kad imamo konkretan objekt (instancu klase), moemo vidjeti konkretne vrijednosti
njegovih osobina (Ime=Ivan, Starost=25, Spol=muki, Zanimanje="Tajni agent"...) i
konkretno mu (objektu klase Osoba) moemo zadati ponaanje (Promatraj).
Klase u objektno orijentiranom programiranju imaju veliku prednost jer su u njima osobine i
sposobnosti nekog pojma (entiteta) uahurene (engl. encapsulated) u jedinstvenoj, samostojeoj i
samoodrivoj jedinici programskog kda.
Tako i u naem primjeru, kada elimo objektu "Ivan" klase Osoba zadati ponaanje Promatraj,
samo pozovemo njegovu metodu Promatraj(). Kako e on to uiniti, uope nam nije bitno, bitno
jest samo da se ta metoda izvede.
Stari programerski vic kae: "Koliko je objektno orijentiranih programera potrebno da se promijeni
arulja? Odgovor: Niti jedan. arulji se jednostavno kae da se sama promijeni ".
A ako nam je ipak bitno kako se izvrava ta metoda, onda emo na jedinstvenom mjestu, u
definiciji klase Osoba, pronai jedinstvenu definiciju metode Promatraj() i tamo utvrditi detalje koji
nas zanimaju.
U ovom poglavlju objasnit emo kako se definiraju klase i njihovi elementi - lanovi klase (engl.
members): ponaanja (engl. behaviors) i svojstva (engl. properties) u programskom jeziku C#.
Opisat emo kako se metode koriste za definiranje ponaanja klase i kako se stanje klase odrava
u varijablama lanicama (esto se nazivaju i polja (engl. fields)). Vidjet emo takoer i kako se
kreiraju svojstva koja razvojnim inenjerima izgledaju kao metode, a klijentima klase kao polja.

3.1.1. Deklariranje i definiranje klase


U programskom jeziku C# potpuna sintaksa za definiranje klase glasi:
[modifikator pristupa] class identifikator [:osnovna klasa [, suelje(a)]]
{
// tijelo klase: definicija svojstava, metoda i dogaaja
}

Uoavamo da se klasa deklarira pomou kljune rijei class koju slijedi proizvoljan naziv klase
(identifikator) i zatim, unutar bloka vitiastih zagrada ({}), slijede definicije lanova od kojih se
sastoji tijelo klase.
Modifikator pristupa je neobavezni dio definicije. Obino se koristi public.
Dio deklaracije iza naziva (identifikatora): osnovna klasa i suelje(a) odnosi se na
nasljeivanje. Klasa u C#-u moe naslijediti lanove jedne klase i lanove proizvoljnog broja
suelja. Nasljeivanje je isto neobavezan dio deklaracije, a o njemu e vie govora biti u nastavku.
Uzmimo za primjer nau klasu Osoba i pokuajmo analizirati njezinu deklaraciju i definiciju:

tel: 01 2222 182, e-mail: info@racunarstvo.hr

www.racunarstvo.hr

Str.51

OBJEKTNO ORIJENTIRANO PROGRAMIRANJE

public class Osoba


{
// javno dostupna polja
public string Ime;
public string Prezime;
public int Starost;
public string Spol;
public string Zanimanje;
// privatno polje
private DateTime VrijemeInstanciranja = DateTime.Now;
// javna metoda
public void IspisiDetalje()
{
Console.WriteLine("Objekt klase Osoba - detalji:");
Console.WriteLine(
"Ime: " + Ime + "\n" +
"Prezime: " + Prezime + "\n" +
"Starost: " + Starost + "\n" +
"Spol: " + Spol + "\n" +
"Zanimanje: " + Zanimanje + "\n" +
"Vrijeme instanciranja: " + VrijemeInstanciranja.ToLongTimeString()
);
}
}

Dakle, naa klasa deklarirana je pomou modifikatora pristupa public i zove se Osoba. Unutar nje
definirano je pet public polja (Ime, Prezime, Starost, Spol, Zanimanje), jedno private polje
(VrijemeInstanciranja) i jedna public void metoda IspisiDetalje().
Napomena: Za definiranje privatnog polja VrijemeInstanciranja koristili smo sistemsku
strukturu DateTime koja u .NET platformi opisuje podatak za datum i vrijeme.
DateTime.Now daje trenutni datum i vrijeme sistemskog sata raunala na kojem se
program izvrava. Dakle, u trenutku instanciranja novog objekta, vrijednost ovog
privatnog polja bit e postavljena na trenutani datum i vrijeme.

3.1.1.1. Operator konkatenacije (+)


Zadatak metode IspisiDetalje() je ispisati vrijednosti pojedinih lanova klase (objekta koji e
biti instanciran iz klase) na konzolu. U metodi IspisiDetalje() operator plus (+) predstavlja
operator konkatenacije (lijepljenja znakova), a ne operator zbrajanja kao kod pitanja brojanih
vrijednosti.
Ovaj operator prvo spaja sve znakovne isjeke u jedinstveni niz znakova, a zatim se taj niz ispisuje
u jednom pozivu metode Console.WriteLine().

3.1.2. Modifikatori pristupa


Modifikator pristupa kontrolira dostupnost elementa kojeg odreuje vanjskim objektima. U
prethodnom primjeru modifikator pristupa public ispred kljune rijei class oznaava klasu Osoba
kao javno dostupnu, tj. dostupnu svima. Pod tim podrazumijevamo da bilo koji objekt iz bilo kojeg
imenskog prostora moe vidjeti klasu Osoba i iz nje instancirati novi objekt, tj. moe ju normalno
koristiti.

Zagreb Ilica 242

Visoka

kola za primijenjeno raunarstvo

Str.52

3. POGLAVLJE: KLASE I OBJEKTI

Isto tako, pet public polja unutar klase Osoba bit e javno dostupno i izvan same klase, tj. vidljivo
svim korisnicima objekta instanciranog iz te klase.
Meutim, suprotno tomu, private polje VrijemeInstanciranja nee biti javno dostupno, nego je
ono privatno polje koje se moe koristiti jedino unutar klase Osoba.
Public (javna) metoda IspisiDetalje() objektima instanciranim iz klase Osoba dostupna je
samo za pozivanje, tj. objekt moe dohvatiti samo njezino ime. Korisnik objekta moe ju pozvati, ali
ne moe vidjeti njezino tijelo. Ovaj princip omoguuje programerima da po elji detaljno oblikuju
suelje svojim objektima (uoimo u primjeru da e se u ispisu detalja o objektu nalaziti informacija
o vremenu instanciranja, ali nitko izvana nee vidjeti da je to omoguilo private polje
VrijemeInstanciranja definirano unutar klase Osoba).
U sljedeoj tablici pogledajmo saetak modifikatora pristupa u programskom jeziku C#.
Modifikator pristupa

Ogranienja

public

Nema ogranienja. lanovi ogranieni modifikatorom public vidljivi su


svim metodama iz svih klasa.

private

lanovima neke klase A oznaenima modifikatorom private mogu


pristupiti samo metode klase A.

protected

lanovima klase A oznaenima modifikatorom protected mogu


pristupiti metode klase A i metode onih klasa izvedenih (naslijeenih) iz
klase A.

internal

lanovima klase A oznaenima modifikatorom internal mogu pristupiti


metode klase svih klasa iz sklopa klase A.

protected internal

lanovima klase A oznaenima modifikatorom protected internal


mogu pristupiti metode klase A, metode klasa izvedenih (naslijeenih) iz
klase A i metode svih klasa iz sklopa klase A. Ovo je zapravo
protected ILI internal koncept (ne postoji protected I internal)

Tablica 6 Modifikatori pristupa u programskom jeziku C#

Napomena: Iako se moemo osloniti na injenicu da se sve klase i svi lanovi klase prema
podrazumijevanim postavkama deklariraju kao private, dobro je prakticirati i
eksplicitno pisanje private modifikatora pristupa. Izriito zadavanje pristupa
oznaava svjesnu odluku i olakava pregled kda.

3.1.3. Instanciranje (stvaranje) objekata


Ve smo rekli da postoji analogija u parovima pojmova tip-varijabla i klasa-objekt.
Po toj analogiji, kao to nije mogue napisati:
int = 5;

nije mogue napisati niti neto kao:


Osoba = Ivan;

tel: 01 2222 182, e-mail: info@racunarstvo.hr

www.racunarstvo.hr

Str.53

OBJEKTNO ORIJENTIRANO PROGRAMIRANJE

Drugim rijeima, kao to nije mogue dodijeliti vrijednost ugraenom tipu, tako ni sintaksa
programskog jezika C# ne dozvoljava dodjeljivanje vrijednosti samoj klasi kao novom definiranom
tipu.
Umjesto toga, kod primitivnih tipova uvijek smo deklarirali varijablu odreenog tipa, a zatim se toj
varijabli mogla dodijeliti vrijednost.
int x = 5;

Isto je potrebno napraviti i s klasom instancirati (stvoriti) novi objekt te klase, a zatim dodijeliti
vrijednosti njegovim poljima.
Ipak, sintaksa za stvaranje novih objekata nije u potpunosti ista kao za stvaranje novih varijabli.
Razlika postoji jer su primitivni tipovi varijabli (int, char...) vrijednosni tipovi i stvaraju se na
stogu, dok su objekti referentni tipovi podataka i stvaraju se na hrpi.
Stoga za instanciranje objekata koristimo kljunu rije new, kao na primjer:
Osoba o1 = new Osoba();

Varijabla objekta o1 zapravo ne sadri vrijednost za instancirani objekt klase Osoba, ve samo
adresu tog (neimenovanog) objekta koji je stvoren na hrpi. o1 je samo referenca tog objekta.

3.1.4. Primjer deklaracije, definicije i instanciranja novog objekta klase


using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;

namespace DeklaracijaKlase
{
public class Osoba
{
// javno dostupna polja
public string Ime;
public string Prezime;
public int Starost;
public string Spol;
public string Zanimanje;
// privatno polje
private DateTime VrijemeInstanciranja = DateTime.Now;

// inicijalizator

// javna metoda
public void IspisiDetalje()
{
Console.WriteLine("Objekt klase Osoba - detalji:");
Console.WriteLine(
"Ime: " + Ime + "\n" +
"Prezime: " + Prezime + "\n" +
"Starost: " + Starost + "\n" +
"Spol: " + Spol + "\n" +
"Zanimanje: " + Zanimanje + "\n" +
"Vrijeme instanciranja: " + VrijemeInstanciranja.ToLongTimeString()
);
}
}
class Program

Zagreb Ilica 242

Visoka

kola za primijenjeno raunarstvo

Str.54

3. POGLAVLJE: KLASE I OBJEKTI

{
static void Main(string[] args)
{
Osoba o1 = new Osoba(); // instanciranje novog objekta klase Osoba
// dodjeljivanje vrijednosti javnim poljima objekta
o1.Ime = "Ivan";
o1.Prezime = "Ivankovi";
o1.Starost = 25;
o1.Spol = "Muki";
o1.Zanimanje = "Tajni agent";
// poziv public metode objekta
o1.IspisiDetalje();
}
}
}

U ovom programu nalaze se dvije klase: Osoba i Program.


Klasa Osoba je javno dostupna korisniki definirana klasa koja definira pojam osobe. U klasi Osoba
su zato javno dostupni lanovi koji opisuju osobine osobe polja: Ime, Prezime, Starost, Spol i
Zanimanje te metoda IspisiDetalje() koja ima zadatak na konzoli ispisati vrijednosti svih
definiranih polja.
Klasa Program je uobiajeno definirana sa svojom metodom Main() u kojoj poinje izvoenje
programa. U toj metodi instanciran je novi objekt o1 klase Osoba. Tek sada, kad je objekt stvoren,
preko njegovog imena moemo dohvatiti sve javne (public) lanove definirane u njegovoj
matinoj klasi Osoba i dodijeliti im konkretne vrijednosti.
Pozivom public metode IspisiDetalje() na konzoli se ispisuju sve dodijeljene vrijednosti.
Pokrenemo li program, dobit emo sljedei prikaz na konzoli:

Slika 14 Primjer deklaracije, definicije i instanciranja novog objekta klase


Pokuamo li u Main() metodi pozvati i privatno (private) polje VrijemeInstanciranja, kao na
primjer:
o1. VrijemeInstanciranja = DateTime.Now;

prevoditelj e javiti sljedeu greku:


'DeklaracijaKlase.Osoba'
does
not
contain
a
definition
for
'VrijemeInstanciranja' and no extension method 'VrijemeInstanciranja' accepting
a first argument of type 'DeklaracijaKlase.Osoba' could be found (are you
missing a using directive or an assembly reference?)

tel: 01 2222 182, e-mail: info@racunarstvo.hr

www.racunarstvo.hr

Str.55

OBJEKTNO ORIJENTIRANO PROGRAMIRANJE

to nam govori da on uope nije svjestan postojanja polja VrijemeInstanciranja u objektu o1


klase Osoba.
Dakle, privatno polje klase nije dio suelja objekta instanciranog iz te klase, nego se moe koristiti
iskljuivo unutar klase za oblikovanje drugih lanova tog suelja (npr. kao u ovom sluaju za
metodu IspisiDetalje()).

3.1.5. Konstruktori
Iz sintakse koja se koristi za instanciranje novog objekta:
Osoba o1 = new Osoba();

vidimo da taj iskaz izgleda kao da poziva metodu, i to zajedno sa zagradama (()). Zapravo,
metoda se i poziva svaki put kad instanciramo novi objekt. Ta metoda naziva se konstruktor.
Zadatak konstruktora je stvaranje objekta koji je definiran klasom i njegovo postavljanje u ispravno
stanje.
Klasa Osoba iz naeg primjera ne definira konstruktor eksplicitno pa ga u tom sluaju CLR i
prevoditelj sami pruaju. Taj podrazumijevani (defaultni) konstruktor stvara u memoriji objekt
klase Osoba, ali ne izvodi nikakvu drugu akciju.
Varijable, koje su lanice klase (polja), inicijaliziraju se u bezazlene vrijednosti (cjelobrojne
vrijednosti se inicijaliziraju s nulom, nizovi znakova s praznim nizom).
U sljedeoj tablici nalazi se popis vrijednosti koje se podrazumijevano dodjeljuju primitivnim
tipovima.
Tip

Podrazumijevana vrijednost

Brojani (int, long, itd.)

char

'\0' (null)

enum

logiki

false

reference

null

Tablica 7 Podrazumijevane vrijednosti primitivnih tipova u programskom jeziku C#


Pokuajmo u prethodnom primjeru zakomentirati linije unutar metode Main() u kojima smo
dodjeljivali vrijednosti public poljima objekta o1 klase Osoba:
static void Main(string[] args)
{
Osoba o1 = new Osoba(); // instanciranje novog objekta klase Osoba
//
//
//
//
//
//

dodjeljivanje vrijednosti javnim poljima objekta


o1.Ime = "Ivan";
o1.Prezime = "Ivankovi";
o1.Starost = 25;
o1.Spol = "Muki";
o1.Zanimanje = "Tajni agent";

// poziv public metode objekta


o1.IspisiDetalje();
}

Zagreb Ilica 242

Visoka

kola za primijenjeno raunarstvo

Str.56

3. POGLAVLJE: KLASE I OBJEKTI

Pokretanjem ovako izmijenjenog programa dobit emo sljedei rezultat u konzoli:

Slika 15 Inicijalizacija polja na bezazlene vrijednosti

3.1.5.1. Eksplicitna definicija konstruktora


U veini emo sluajeva konstruktor definirati sami i proslijediti mu parametre da bi mogao
postaviti objekt u poetno stanje.
Na prethodni primjer mogao bi se onda preraditi ovako:
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Text;

namespace Konstruktori
{
public class Osoba
{
// Eksplicitno navedeni konstruktor
public Osoba(string ime, string prezime, int starost,
string spol, string zanimanje)
{
this.Ime = ime;
this.Prezime = prezime;
this.Starost = starost;
this.Spol = spol;
this.Zanimanje = zanimanje;
}
// javno dostupna polja
public string Ime;
public string Prezime;
public int Starost;
public string Spol;
public string Zanimanje;
// privatno polje
private DateTime VrijemeInstanciranja = DateTime.Now;

// inicijalizator

// javna metoda
public void IspisiDetalje()
{
Console.WriteLine("Objekt klase Osoba - detalji:");
Console.WriteLine(
"Ime: " + Ime + "\n" +

tel: 01 2222 182, e-mail: info@racunarstvo.hr

www.racunarstvo.hr

Str.57

OBJEKTNO ORIJENTIRANO PROGRAMIRANJE


"Prezime: " + Prezime + "\n" +
"Starost: " + Starost + "\n" +
"Spol: " + Spol + "\n" +
"Zanimanje: " + Zanimanje + "\n" +
"Vrijeme instanciranja: "
+ VrijemeInstanciranja.ToLongTimeString()
);
}

}
class Program
{
static void Main(string[] args)
{
// instanciranje novog objekta pomou eksplicitno definiranog konstruktora
Osoba o1 = new Osoba("Ivan", "Ivankovi", 25, "Muki", "Tajni agent");
o1.IspisiDetalje();
}
}
}

Dakle, u klasi osoba deklarirali smo i definirali konstruktor na sljedei nain:


public Osoba(string ime, string prezime, int starost, string spol, string zanimanje)
{
this.Ime = ime;
this.Prezime = prezime;
this.Starost = starost;
this.Spol = spol;
this.Zanimanje = zanimanje;
}

Deklaracija konstruktora poinje kljunom rijei public koja osigurava mogunost poziva ove
metode vanjskim objektima. Zatim se navodi ime metode (konstruktora) koje je zapravo ime same
klase (Osoba) te unutar zagrada (()) slijedi deklaracija parametara. Za svaki parametar navodi se
njegov povratni tip i ime. Parametri se odvajaju zarezima (,).

Napomena: Primijetimo da je konstruktor metoda koja nema povratni tip. Tip kojeg ova metoda
vraa je zapravo sama klasa u kojoj ju definiramo (Osoba). Drugim rijeima, poziv
konstruktora vratit e instancirani objekt te klase (objekt klase Osoba).
Unutar tijela konstruktora definirano je da se svakom public polju klase vrijednost inicijalizira na
vrijednost odgovarajueg parametra.
Definiranje konstruktora na ovakav nain omoguuje stvaranje novog objekta klase Osoba pomou
samo jedne linije kda, kao to moemo vidjeti u metodi Main():
Osoba o1 = new Osoba("Ivan", "Ivankovi", 25, "Muki", "Tajni agent");

Nadalje, u pozivu konstruktora prosljeuju se konkretne vrijednosti parametara ("Ivan",


"Ivankovi"). Kad je novi objekt o1 klase Osoba instanciran, konstruktor se pobrinuo i za
ispravno inicijaliziranje svih njegovih javno dostupnih polja.
Pokretanjem ovog programa dobit emo u konzoli isti rezultat kao i u prethodnom primjeru.

Zagreb Ilica 242

Visoka

kola za primijenjeno raunarstvo

Str.58

3. POGLAVLJE: KLASE I OBJEKTI

3.1.6. Inicijalizatori
Umjesto u konstruktoru, vrijednosti polja (varijabli lanica) mogu se inicijalizirati u inicijalizatorima
(engl. initializer). Inicijalizator moemo stvoriti pridruivanjem poetne vrijednosti lanu klase. U
naem primjeru pomou inicijalizatora smo dodijelili poetnu vrijednost privatnom polju
VrijemeInstanciranja na vrijednost trenutnog datuma i vremena sistemskog sata:
private DateTime VrijemeInstanciranja = DateTime.Now;

// inicijalizator

Napomena: Izostavimo li inicijalizator u prethodnom primjeru, konstruktor bi obavio bezazlenu


inicijalizaciju privatnog polja VrijemeInstanciranja i na konzoli bi se kao vrijeme
instanciranja ispisalo 0:00:00.

3.1.1

Kljuna rije this

Kljuna rije this upuuje na trenutnu instancu objekta. Moemo rei i ovako: kad se instancira
objekt iz klase, this predstavlja taj objekt.
Referenca this je skrivena referenca dostupna svim nestatikim metoda klase (metodama koje
nemaju kljunu rije static u svojoj deklaraciji). Preko reference this svaka nestatika metoda
moe pozivati sve druge nestatike lanove (metode i varijable) objekta.
this se moe koristiti na razne naine.
3.1.7.1. Kvalifikacija lanova instance skrivenih parametrima pomou this
U prethodnom primjeru imamo definiran konstruktor koji dodjeljuje lanovima klase (poljima)
vrijednosti proslijeene parametrima. Primijetimo da se i lanovi klase, i parametri jednako nazivaju
(Ime ime, Prezime prezime...). Kod ovakvog stila imenovanja dobro je to to je iz naziva
jasno koji parametar inicijalizira koje polje. Loa je strana to isti nazivi mogu zbuniti.
Referenca this stoga se ovdje koristi za rjeavanje vieznanosti naziva. Kad napiemo
this.Ime, jasno je da se radi o lanu klase, a ne o parametru. Stoga je za pozivanje lana klase
preporuljivo uvijek navoditi this.
Metoda IspisiDetalje() tada bi izgledala ovako:
public void IspisiDetalje()
{
Console.WriteLine("Objekt klase Osoba - detalji:");
Console.WriteLine(
"Ime: " + this.Ime + "\n" +
"Prezime: " + this.Prezime + "\n" +
"Starost: " + this.Starost + "\n" +
"Spol: " + this.Spol + "\n" +
"Zanimanje: " + this.Zanimanje + "\n" +
"Vrijeme instanciranja: " + this. VrijemeInstanciranja.ToLongTimeString()
);
}

Napomena: Referenca this koristi se jo i kod prosljeivanja cijelog objekta kao parametra u
drugu metodu, prilikom rada s indekserima i kod koritenja preoptereenih
konstruktora. Detalje o tim primjenama vidjet emo u narednim poglavljima.

tel: 01 2222 182, e-mail: info@racunarstvo.hr

www.racunarstvo.hr

You might also like