klasa, svojstva i konstruktori - mg.edu.rs klasa, svojstva i konstruktori.pdf · klasa, svojstva i...

9
Klasa, svojstva i konstruktori Klasa, atributi i metode Osnovni pojam u objektno orijentisanom programiranju je klasa. Klasa predstavlja uopštenje objekata koji imaju zajedničke osobine i funkcionalnosti. Osobine opisujemo atributima a funkcionalnosti metodima. Posmatrajmo nastavni proces u školi. Recimo da u učionici 1 učenik IVa, Pera, radi zadatak iz matematike po zahtevu profesora Laze, a u učionici 2 profesor Mika predaje svim učenicima odeljenja IVb novu lekciju iz fizike. Sasvim je moguće da sutradan uloge profesora budu promenjene, pa da profesor Mika u IVa ispituje ili predaje novu lekciju iz fizike, a profesor Laza u IVb predaje novu lekciju iz matematike. Već u ovom uprošćenom prikazu nastavnog procesa možemo uočiti osnovne objekte koji učestvuju u njemu (Pera, Mika, Laza, IVa, IVb, matematika, fizika, učionica 1…). Lako se može uočiti da Mika i Laza koordiniraju nastavnim procesom, da upoznaju učenike sa novim gradivom, da vrše proveru znanja učenika, ocenjuju ga. Oni imaju i zajedničke osobine (ime, stručna sprema, predmet koji predaju, godine staža). Samim tim oni pripadaju jednoj od klasa učesnika u nastavnom procesu, klasi Profesor. Na sličan način možemo uočiti i klase Ucenik (Pera), Predmet (matematika, fizika), Odeljenje (IVa, IVb)… Do klasa dolazimo polazeći od pojedinačnih objekata. Posmatranjem svih učenika uočavamo njihova zajedničke osobine. Na primer, za sve učenike je potrebno pratiti ime, prezime, datum roñenja, razred, odeljenje. Te osobine nazivamo atributima. Takoñe, svim učenicima možemo pridružiti iste „akcije“: učenik odgovara i dobija ocenu, učenik menja odeljenje... Te akcije u okviru klase nazivamo metodima klase, i njima se opisuje funkcionalnost objekata te klase. Klasu definišemo navoñenjem rezervisane reči class iza koje sledi identifikator klase (ime klase). Posle imena, ako formiramo klasu koja nasleñuje neku, prethodno definisanu, navodimo ’:’ a zatim sledi ime klase iz koje je izvedena. Zatim u vitičastim zagradama {} definišemo članove klase (atribute i metodi). class <imeKlase> :<imePrethodnoDefinisaneKlase> { opis / definicija članova klase } Na primer, klasu učenika možemo intuitivno definisati na sledeći način: class Ucenik { string ime, prezime; DateTime datumRodjenja; int razred; int SkolskaGodina; char odeljenje; Ocena [] ocene;

Upload: lythien

Post on 05-Feb-2018

351 views

Category:

Documents


25 download

TRANSCRIPT

Page 1: Klasa, svojstva i konstruktori - mg.edu.rs Klasa, svojstva i konstruktori.pdf · Klasa, svojstva i konstruktori Klasa, atributi i metode Osnovni pojam u objektno orijentisanom programiranju

Klasa, svojstva i konstruktori

Klasa, atributi i metode

Osnovni pojam u objektno orijentisanom programiranju je klasa. Klasa predstavlja uopštenje objekata koji imaju zajedničke osobine i funkcionalnosti. Osobine opisujemo atributima a funkcionalnosti metodima.

Posmatrajmo nastavni proces u školi. Recimo da u učionici 1 učenik IVa, Pera, radi zadatak iz matematike po zahtevu profesora Laze, a u učionici 2 profesor Mika predaje svim učenicima odeljenja IVb novu lekciju iz fizike. Sasvim je moguće da sutradan uloge profesora budu promenjene, pa da profesor Mika u IVa ispituje ili predaje novu lekciju iz fizike, a profesor Laza u IVb predaje novu lekciju iz matematike.

Već u ovom uprošćenom prikazu nastavnog procesa možemo uočiti osnovne objekte koji učestvuju u njemu (Pera, Mika, Laza, IVa, IVb, matematika, fizika, učionica 1…). Lako se može uočiti da Mika i Laza koordiniraju nastavnim procesom, da upoznaju učenike sa novim gradivom, da vrše proveru znanja učenika, ocenjuju ga. Oni imaju i zajedničke osobine (ime, stručna sprema, predmet koji predaju, godine staža). Samim tim oni pripadaju jednoj od klasa učesnika u nastavnom procesu, klasi Profesor. Na sličan način možemo uočiti i klase Ucenik (Pera), Predmet (matematika, fizika), Odeljenje (IVa, IVb)…

Do klasa dolazimo polazeći od pojedinačnih objekata. Posmatranjem svih učenika uočavamo njihova zajedničke osobine. Na primer, za sve učenike je potrebno pratiti ime, prezime, datum roñenja, razred, odeljenje. Te osobine nazivamo atributima. Takoñe, svim učenicima možemo pridružiti iste „akcije“: učenik odgovara i dobija ocenu, učenik menja odeljenje... Te akcije u okviru klase nazivamo metodima klase, i njima se opisuje funkcionalnost objekata te klase.

Klasu definišemo navoñenjem rezervisane reči class iza koje sledi identifikator klase (ime klase). Posle imena, ako formiramo klasu koja nasleñuje neku, prethodno definisanu, navodimo ’:’ a zatim sledi ime klase iz koje je izvedena. Zatim u vitičastim zagradama {} definišemo članove klase (atribute i metodi).

class <imeKlase> :<imePrethodnoDefinisaneKlase>

{

opis / definicija članova klase

}

Na primer, klasu učenika možemo intuitivno definisati na sledeći način:

class Ucenik

{

string ime, prezime;

DateTime datumRodjenja;

int razred;

int SkolskaGodina;

char odeljenje;

Ocena [] ocene;

Page 2: Klasa, svojstva i konstruktori - mg.edu.rs Klasa, svojstva i konstruktori.pdf · Klasa, svojstva i konstruktori Klasa, atributi i metode Osnovni pojam u objektno orijentisanom programiranju

double prosek()

{

}

double prosek(Predmet P)

{

}

void uci(Lekcija X)

{

}

}

Da bi napravili objekat, upotrebljavamo izraz oblika

<ime objekta> =new <ime klase> () .

Korišćenjem operatora new odvaja se u dinamičkoj memoriji prostor za registrovanje objekta klase <ime klase>. Ovaj operator vraća adresu dodeljenog prostora koju onda možemo dodeliti imenu objekta:

Ucenik x=new Ucenik();

Atributima opisujemo odreñenu osobinu objekta (ime, prezime, datumRodjenja, razred, odeljenje). Najčešće, različiti objekti iste klase imaju različite vrednosti atributa. Često kažemo da vrednosti atributa definišu stanje objekta. Pri opisu atributa moramo navesti tip kome taj atribut pripada (celobrojni, realni, znakovni, ) i ime atributa. Pristup atributima objekta neke klase realizujemo na sledeći način:

imeObjekta.imeAtributa

Na primer, ako je x objekat klase Ucenik, atributu ime pristupamo navoñenjem x.ime.

Metodom opisujemo ponašanje objekta u odreñenoj situaciji i pod odreñenim uslovima (uci), ali i odreñujemo nove vrednosti na osnovu osobina koje objekat poseduje (prosek). Na taj način opisujemo funkcionalnost objekta.

Metod klase je imenovani blok naredbi koji se sastoji iz zaglavlja i tela metoda. U zaglavlju navodimo povratni tip (ako metod ne proizvodi vrednost koju vraća, navodimo rezervisanu reč void), zatim ime metoda za kojim sledi u malim zagradama spisak parametara metoda. Za svaki parametar navodi se tip kome taj parametar pripada kao i ime parametra. Posle zaglavlja u vitičastim zagradama navodimo telo metoda koje se sastoji iz odgovarajućih iskaza programskog jezika C#.

<povratni tip> <ime metoda>(<lista parametara>)

{ <telo metoda> }

Poziv metoda objekta u programskom jeziku C# realizujemo na sledeći način:

Page 3: Klasa, svojstva i konstruktori - mg.edu.rs Klasa, svojstva i konstruktori.pdf · Klasa, svojstva i konstruktori Klasa, atributi i metode Osnovni pojam u objektno orijentisanom programiranju

imeObjekta.imeMetoda(lista stvarnih parametara)

Na primer, ako je x objekat klase Ucenik, metod prosek pozivamo x.prosek(), a metod uci, x.uci(L) gde je L objekat klase Lekcija.

Ukoliko u telu metode koristimo neki od atributa ili pozivamo neku drugu metodu te klase, ne navodimo ime objekta već samo ime atributa odnosno metode. Umesto imena objekta možemo navesti službenu reč this. Primerak klase kome se obraćamo preko this je trenutni primerak klase.

Različite metode u jednoj klasi mogu imati isti naziv ali se moraju razlikovati po broju ili tipu parametara. Pisanje metoda istog imena a različitih lista parametara naziva se preklapanje (overloading), preopterećivanje metode. U klasi Ucenik metod prosek smo preopteretili: za učenika možemo računati prosek svih zaključenih ocena a možemo i prosek svih njegovih ocena iz datog predmeta.

Svojstva

Jedna od najznačajnih karakteristika objektno orijentisanog programiranja je enkapsulacija (zatvorenost, učaurenje) objekata. Pod enkapsulacijom objekta podrazumevamo kontrolisan pristup elementima objekta. Nekim elementima objekta mogu pristupiti svi koji taj objekat na bilo koji način koriste. Te elemente nazivamo javnim (public) i oni čine deo preko koga objekat komunicira sa drugim objektima. Nasuprot njima postoji deo objekta koji ne koristimo direktno u komunikaciji sa drugim objektima, da ne bi bio izložen neovlašćenom pristupu ili promeni. Za takve elemente kažemo da su privatni (private).

Vrlo često postoji potreba da se atributi zaštite od neovlašćenog pristupa ili promene pa su oni uglavnom privatni članovi klase, dok su metode u većini slučajeva javne.

Posmatrajmo klasu Vreme kojom ćemo opisivati trajanje odreñenih procesa. Vreme možemo definisati uz pomoć različitih atributa na primer satima, minutama i sekundama, ili danima, satima, minutama i sekundama i slično. Da bi što efektnije prikazali različite elemente klase, vreme ćemo u primeru koji sledi definisati samo jednim atributom koji predstavlja broj sekundi.

public class Vreme

{

long sekunde; // ili Int64 sekunde;

public long VratiSate() // broj sati sadrzanih u vremenu

{

return sekunde / 3600;

}

public long VratiMinute() // broj minuta sadrzanih u vremenu

{

return sekunde/60;

}

public long VratiSekunde()

{

return sekunde ;

Page 4: Klasa, svojstva i konstruktori - mg.edu.rs Klasa, svojstva i konstruktori.pdf · Klasa, svojstva i konstruktori Klasa, atributi i metode Osnovni pojam u objektno orijentisanom programiranju

}

}

Metode VratiSate i VratiMinute računaju odreñene informacije pa je razlog njihovog postojanja intuitivno jasan. Postavlja se pitanje zašto postoji metoda VratiSekunde kada broj sekundi sadržanih u vremenu opisuje atribut sekunde. Atribut sekunde je privatni član klase pa ne možemo saznati njegovu vrednost van nje. Zato uvodimo javni metod VratiSekunde() koji će nam omogućiti pristup toj informaciji. Ovim metodom dobijamo informaciju o broju sekundi ali je i dalje ne možemo promeniti (read-only).

Radi lakšeg pristupa privatnim atributima klase u programskom jeziku C# možemo kreirati svojstva (property) i ona po potrebi mogu imati sledeće komponente:

• get , koja na osnovu vrednosti atributa odreñuje i vraća neku karakteristiku objekta (korišćenjem naredbe return)

• set, koja na osnovu zadate vrednosti (value) računa i postavlja vrednosti atributa.

Svojstvo definišemo na sledeći način:

public <povratni tip svojstva> <ime svojstva>

{

get { <telo get komponente> }

set {<telo set komponente> }

}

Svojstva nisu ni atributi ni metode iako imaju karakteristike i atributa i metoda. Kao i atributi svojstva nemaju parametre, a u njihovim komponentama, kao i u metodama, može se navesti proizvoljan niz naredbi programskog jezika C# . U get komponenti obavezno je navoñenje naredbe return kojom se vraća izračunata vrednost.

Svojstva se pozivaju navoñenjem imena objekta za kojim sledi ime svojstva odvojeno tačkom. Ako se u izrazu poziv svojstva nalazi sa leve strane operatora dodele izvršava se set komponenta svojstva, a u suprotnom izvršava se get komponenta.

U klasi Vreme možemo definisati svojstvo Sekunde na sledeći način:

public long Sekunde

{

get { return sekunde; }

set { sekunde = value; }

}

Komponenta get ovog svojstva ima ekvivalentno dejstvo kao i metoda VratiSekunde() , a set komponenta nam omogućava da postavljamo vrednosti privatnom atributu sekunde. Ovako definisanim svojstvom narušavamo enkapsulaciju jer je atribut sekunde postao potpuno dostupan. Samim tim mogli smo definisati atribut kao javan. U većini slučajeva potrebno je da van klase možemo pročitati vrednost atributa a da ga ne možemo menjati. Tada koristimo svojstvo kod kojeg nije definisana set komponenta (read only svojstvo, samo za čitanje).

Page 5: Klasa, svojstva i konstruktori - mg.edu.rs Klasa, svojstva i konstruktori.pdf · Klasa, svojstva i konstruktori Klasa, atributi i metode Osnovni pojam u objektno orijentisanom programiranju

public long Sekunde

{

get { return sekunde; }

}

Ukoliko je vrednost atributa ograničenog opsega, u set komponenti možemo izvršiti kontrolu vrednosti koju postavljamo. Na primer, ako klasu Vreme opisujemo atributima sat, minut i sekund, možemo proveravati da li je vrednost koju postavljamo za atribute minut i sekund u dozvoljenim granicama (od 0 do 59).

Vrlo često postoje karakteristike objekta koje zavise i mogu se izračunati na osnovu vrednosti atributa. Možemo definisati svojstva kojima odreñujemo vrednost tih karakteristika.

Primetimo da objekte klase Vreme možemo opisati i pomoću tri cela broja koji predstavljaju broj sati , minuta ( minut<60) i sekundi ( sekund<60). Definišimo svojstva Sat, Minut i Sekund koja zadovoljavaju jednakost:

Sat*3600+Minut*60+Sekund=sekunde.

public long Sekund

{

get { return sekunde%60; }

}

public long Minut

{

get { return (sekunde / 60) % 60; }

}

public long Sat

{

get { return sekunde / 3600; }

}

Ova svojstva nam omogućavaju da pročitamo vrednosti Sat, Minut i Sekund. Bilo bi prirodno da možemo i postaviti njihovu vrednost. Promena vrednosti svake od ovih karakteristika povlači i promenu atributa sekunde, pa možemo realizovati i odgovarajuće set komponente.

public long Sekund

{

get { return sekunde%60; }

set { sekunde = sekunde-Sekund+value; }

}

public long Minut

{

get { return (sekunde / 60) % 60; }

set { sekunde = sekunde-Minut*60+value*60; }

}

public long Sat

{

Page 6: Klasa, svojstva i konstruktori - mg.edu.rs Klasa, svojstva i konstruktori.pdf · Klasa, svojstva i konstruktori Klasa, atributi i metode Osnovni pojam u objektno orijentisanom programiranju

get { return sekunde / 3600; }

set { sekunde = sekunde - Sat * 3600 + value * 3600; ; }

}

Indekseri

U programskom jeziku C# možemo imati članove klase koje zovemo indekserima, koji imaju sličnosti sa svojstvima ali i svojih specifičnosti.

Indekser nam omogućava da pojedinim karakteristikama objekata klase pristupamo na efikasan način, navoñenjem imena objekta i u uglastim zagradama indeksa koji nas upućuje na odgovarajuću karakteristiku. Kao i svojstva, indekseri imaju get i set komponentu u kojima se u zavisnosti od vrednosti indeksa odreñuje karakteristika objekta, odnosno postavljaju vrednosti atributa. Za razliku od svojstava indekser ima najmanje jedan parametar a može imati i više parametara, pa objekat dobija više dimenzija. Indekser definišemo na sledeći način:

public <povratni tip indeksera> this[ <tip indeksa > <imeindeksa>, …]

{

get { <telo get komponente> }

set {<telo set komponente> }

}

Indekseru programer ne zadaje ime jer on uvek koristi ime this. Slično metodama, indekseri mogu imati preklopljene verzije, koje se moraju razlikovati po broju ili po tipu indeksa.

Klasu Vreme možemo proširiti indekserom koji, u zavisnosti od indeksa, vraća Sat, Minut ili Sekund. Za indeks možemo izabrati: prethodno definisani nabrojivi tip (enum) čije su moguće vrednosti sat, minut i sekund, ili tip char tako da za vrednosti indeksa redom 'h', 'm' i 's' vraća Sat, Minut i Sekund, ili tip string... U navedenoj realizaciji indeksera koristimo prethodno definisana svojstva. Ovaj indekser mogli smo realizovati i bez korišćenja tih svojstava i u tom slučaju on bi mogao i zameniti ta svojstva. Na sličan način kako je realizovana set komponenta svojstava Sat, Minut i Sekund možemo realizovati i set komponentu za svaki od navedenih indeksera.

public enum JedinicaVremena

{

sat,

minut,

sekund

}

public long this[JedinicaVremena j]

{

get

{

if (j == JedinicaVremena.sat)

return Sat; // return sekunde / 3600;

if (j == JedinicaVremena.minut)

return Minut; // return (sekunde / 60) % 60

return Sekund;

Page 7: Klasa, svojstva i konstruktori - mg.edu.rs Klasa, svojstva i konstruktori.pdf · Klasa, svojstva i konstruktori Klasa, atributi i metode Osnovni pojam u objektno orijentisanom programiranju

}

}

public long this[char ch]

{

get

{

if (ch == 'h')

return Sat;

if (ch == 'm')

return Minut;

if (ch == 's')

return Sekund;

return sekunde;

}

}

Ako je A objekat klase Vreme vrednost izraza A[JedinicaVremena.sat] i A['h'] je broj sati sadržanih u vremenu A.

Konstruktori

U C# pri deklaraciji neke instance klase, objekta, rezerviše se prostor za adresu objekta (referencu) a sam objekat se kreira korišćenjem operatora new .

<ime klase> <ime objekta> = new <ime klase>(<lista parametara>) ;

Operator new vraća adresu novog objekta koju dodeljujemo imenu objekta.

Konstruktor je metod koji se poziva pri kreiranju objekta. Konstruktori su sastavni deo svake klase i nose njeno ime. Pozivom konstruktora objekat počinje svoj život. Klasa može imati više konstruktora koji se razlikuju po listi parametara. Lista parametara najčešće sadrži vrednosti kojima inicijalizujemo atribute objekta, a može biti i prazna.

Ako pogramer ne napiše ni jedan konstruktor programski prevodilac bi napravio podrazumevani konstruktor (konstruktor bez parametara, numeričkim tipovima dodeljuje 0, logičkim atributima dodeljuje vrednost false, referentne atribute postavlja na null).

Ako pišemo više konstruktora, kako svi imaju ime klase, moraju se razlikovati po listi parametara, tj. po broju ili tipu parametara.

Za klasu Vreme, definisanu u prethodnom delu članka, možemo definisati sledeće konstruktore:

• Konstruktor bez parametara koji postavlja atribut sekunde na 0 public Vreme()

{

sekunde = 0;

}

• Konstruktor koji za parametar ima inicijalni broj sekundi public Vreme(long x)

{

sekunde = x;

Page 8: Klasa, svojstva i konstruktori - mg.edu.rs Klasa, svojstva i konstruktori.pdf · Klasa, svojstva i konstruktori Klasa, atributi i metode Osnovni pojam u objektno orijentisanom programiranju

}

• Konstruktor koji za parametar ima broj sati i broj minuta public Vreme(long h, long m)

{

sekunde = 3600*h+60*m;

}

• Konstruktor koji za parametar ima broj sati, minuta i sekundi public Vreme(long h, long m, long s)

{

sekunde = 3600 * h + 60 * m + s;

}

• Konstruktor koji za parametar ima string oblika “sati:minuti:sekunde” (ukoliko se ovom konstruktoru prosledi drugačiji format stringa on atribut sekunde postavlja na 0)

public Vreme(string s)

{

try

{

long h = Convert.ToInt64(s.Substring(0, s.IndexOf(':')));

long m = Convert.ToInt64(s.Substring(s.IndexOf(':') + 1,

s.LastIndexOf(':') - s.IndexOf(':') - 1));

long sek = Convert.ToInt64(s.Substring(s.LastIndexOf(':') + 1));

sekunde = 3600 * h + 60 * m + sek;

}

catch

{

sekunde = 0;

}

}

• Takozvani konstruktor kopije koji za parametar ima drugi objekat klase Vreme, v, sekunde postavlja na vrednost istog atributa parametra v.

public Vreme(Vreme v)

{

sekunde = v.sekunde;

}

Zaključak

Ovo je prvi u nizu članaka koji planiramo, kojima ćemo pokušati da populaciji profesora informatike približimo objektno orijentisano programiranje i jedan savremeni programski jezik koji se, po našim dosadašnjim iskustvima, vrlo uspešno može upotrebiti u nastavi, u svim fazama učenja programiranja.

U ovom prvom delu smo Vas upoznali sa osnovnim elementima klase a planirano je da u naredna dva članka obradimo operatore i nasleñivanje.

Predlažemo čitaocima da slično našem primeru klase Vreme realizuju i sledeće klase:

Page 9: Klasa, svojstva i konstruktori - mg.edu.rs Klasa, svojstva i konstruktori.pdf · Klasa, svojstva i konstruktori Klasa, atributi i metode Osnovni pojam u objektno orijentisanom programiranju

• TackaDekart koja predstavlja tačku u Dekartovom koordinatnom sistemu za koju možete definisati svojstva RastojanjeOdCentra, Kvadrant

• Krug, zadat sa dve dijametralno suprotne tačke, sa svojstvima Centar i Poluprecnik

• Vektor, zadat jednom tačkom, sa svojstvima Intezitet, FazniUgao

Za sve tri klase moguće je realizovati i raznovrsne konstruktore, kao i indeksere.

Za kraj, evo i jednog segmenta koda pokazne aplikacije u kome se može uočiti ispravan način pozivanja svakog od elemenata klase koju smo kroz članak obradili:

//kreiranje objekta uz poziv podrazumevanog konstruktora

Vreme T = new Vreme();

//koriscenje set komponente svojstava Sat, Minut, Sekund

T.Sat = 12;

T.Minut = 70;

T.Sekund = 0;

//koriscenje get komponente indeksera sa enum indeksom

Text=T[JedinicaVremena.sat]+" "+T[JedinicaVremena.minut];

//kreiranje objekta uz poziv konstruktorasa parametrom tipa string

T = new Vreme("12:46:30");

//koriscenje get komponente svojstava Sat, Minut, Sekund

label1.Text = T.Sat + " " + T.Minut + " " + T.Sekund;

//kreiranje objekta uz poziv konstruktorasa parametrom tipa string

T = new Vreme("1:20:4");

//koriscenje get komponente indeksera sa char indeksom

label1.Text += " " + T['h'] + " " + T['m'] + " " + T['s'];