CWFT_03

Copyright © Link group

Klase i objekti


Definisanje klase

Klasa predstavlja apstraktnu predstavu skupa objekata koji imaju iste osobine. Sastoji se
od atributa i metoda. Atributi i metode se nazivaju članice klase.Objekat predstavlja
konkretan primerak- instancu klase. Klasu treba shvatiti kao skicu na osnovu koje će
kasnije biti kreirani objekti. U nastavku je prikazana klasa AutomatNovca koja ima dva
javna atributa imePrezime i stanje.

public class AutomatNovca
{
public string imePrezime;
public double stanje;
}

Da bi se klasa definisala koristi se ključna reč class ispred imena klase. Preporuka je da
ime klase počinje velikim slovom. Ako se ime klase sastoji iz više reči tada svaka sledeća
reč počinje velikim slovom. Klasa je korisnički definisani tip.

Instanciranje klase , tj. kreiranje objekata klase vrši se upotrebom službene reči new.
Funkcija koja se nalazi iza ključne reči new naziva se podrazumevani konstruktor i kao
što joj samo ime kaže služi za konstruisanje objekata. Atributima objekta pristupa se
preko operatora .(“tačka”). Ovde je kreiran objekat označen sa an.

AutomatNovca an = new AutomatNovca();
an.imePrezime = “Pera Peric”;
an.stanje = 12345.67;


Metode klase

Metoda klase je funkcija – članica klase. Svaka metoda treba da definiše tip podataka
koji vraća ili ukoliko metoda ne vraća ništa onda se povratni tip metode označava sa
void. Ukolika metoda vrća neku vrednost onda se unutar tela metode koristi službena reč
return. Svaka metoda ima svoje ime. Uobičajeno da ime metode počinje malim slovom.
Metoda može imati listu parametara ili može biti bez parametara. Metoda prikazana u
primeru ima ime podizanjeNovca, ima jedan ulzni parametar tipa double i vraća rezultat
tipa double.

public double podizanjeNovca(double iznos)
{
stanje -= iznos ; // stanje = stanje - iznos
return stanje ;
}

Metoda se koristi za postavljanje vrednosti atributa stanje (koji se nalazi unutar iste
klase kojoj pripada i metoda podizanjeNovca). Prevedeno na poslovnu terminologiju
stanje na računu se samnjuje za podignuti iznos.



Copyright © Link group

Primer klase

Data je definicija klase AutomatNovca koja služi za rad sa nekim tekućim računom. Klasa
ima dva atributa imePrezime i stanje, gde atribut stanje predstavlja stanje na računu
korisnika čije je ime i prezime sadržano u atributu imePrezime. Klasa ima dve metode
uplata i podizanjeNovca. Svakom uplatom povećava se stanje na računu korisnika za
određeni iznos a svakim podizanjem novca vrednost na računu se smanjuje.

public class AutomatNovca
{
public string imePrezime;
public double stanje;

// metoda uplata
public void uplata(double iznos)
{
stanje += iznos;
}
// metoda podizanjeNovca
public double podizanjeNovca(double iznos)
{
stanje -= iznos ; // stanje = stanje - iznos
return stanje ;
}
}


Pozivanje metode

Da bi se metoda klase pozvala potrebno je napraviti objekte te klase a zatim se metodi
klase pristupa korišćenjem operatora .(“tačka”). Ovo važi za tzv. javne metode klase,
odnosno metode uz koje stoji službena reč public. Ovde je kreiran tekući račun tj.
objekat klase AutomatNovca za korisnika pod imenom “Mika Mikic” . Zatim su izvršene
dve uplate na račun korisnika pozivanjem metode uplata. Obratiti pažnju da metoda
uplata ima ulazni parametar tipa double i da ne vraća nikakvu vrednost. Na kraju je
izvršeno jedno podizanje novca korišćenjem metode podizanjeNovca. Ova metoda ima
ulazni parametar tipa double i vraća rezultat tipa double. Rezultat izvršavanja metode je
prihvaćen u promenljivoj tipa double pod nazivom trenutniIznos.

AutomatNovca an1 = new AutomatNovca();
an1.imePrezime = "Mika Mikic";
// uplate na racun
an1.uplata(12345.23);
an1.uplata(1000);
// podizanje novca i racunanje preostalog iznosa
double trenutniIznos = an1.podizanjeNovca(456);


Definisanje konstruktora

Konstruktor je specijalna metoda klase koja se koristi za kreiranje objekata tj.
instanciranje te klase. Konstruktor ima isto ime kao i klasa. Konstruktor ne vraća
nijedan tip, čak ni void. Ukoliko se unutar klase ne definiše konstruktor onda okruženje
obezbeđuje podrazumevani (default) konstruktor. Podrazumevani konstruktor nema
parametre. Može se iskoristiti za inicijalizaciju atributa klase prilikom kreiranja objekata.
Pored podrazumevanog konstruktora moguće je definisati i tzv. parametarske
konstruktore. U jednoj klasi se može definisati veliki broj konstruktora.

Copyright © Link group

U nastavku je dat primer definisanja podrazumevanog i parametarskog konstruktora:

// podrazumevani konstruktor
public AutomatNovca()
{
imePrezime = null;
stanjeNaRacunu = 100;
}

// parametarski konstruktor

public AutomatNovca(string ime, double stanje)
{
imePrezime = ime;
stanjeNaRacunu = stanje;
}

Kada se u klasi definišu metode koje imaju isto ime a različit potpis tj. listu ulaznih
parametara onda se kaže da je izvršen overloading metode. Kada se u klasi definiše više
konstruktora radi se o overloading-u konstruktora.


Poziv konstruktora

U primeru je prikazan način poziva parametarskog i podrazumevanog konstruktora.
Prilikom pozivanja parametarskog konstruktora, atributi odgovarajućeg objekta koji je
konstruisan bivaju inicijalizovani.

AutomatNovca an = new AutomatNovca("Pera Peric", 12000.567);
an.uplata(100);

Kod podrazumevanog konstruktura to nije slučaj već se atributi objekta inicijalizuju
pristupanjem preko operatora .(“tačka”).

AutomatNovca an1 = new AutomatNovca();
an1.imePrezime = "Jovan Jovanovic";
an1.stanjeNaRacunu = 20000;


Predavanje parametara po vrednosti

Ponovo je kreiran deo klase AutomatNovca koja ima atribut stanjeNaRacunu. Da bi se
ilustrovalo predavanje parametara po vrednosti nekoj funkciji, napravljena je metoda
vratiStanjePrekoParametaraVred koja ima jedan ulazni parametar tipa double. Unutar
tela metode se vrednost tog ulaznog parametra inicijalizuje na vrednost atributa
stanjeNaRacunu. Pokušava se da se metodi prosledi neka promenljiva po vrednosti tako
da ona posle izvršavanja te metode sadrži vrednost atributa stanjeNaRacunu. Objekat
klase AutomatNovca označen sa an je kreiran primenom paremetarskog konstruktora
tako da su atributi tog objekta inicijalizovani. Metodi vratiStanjePrekoParametaraVred je
prosleđena promenljiva trenutoStanje koja je prethodno inicijalizovana na vrednost nula.

public class AutomatNovca
{
public double stanjeNaRacunu ;
.......
………
// predavanje parametar preko vrednossti
// metoda clanica klase AutomatNovca

Copyright © Link group


public void vratiStanjePrekoParametaraVred( double stanje1)
{
stanje1 = stanjeNaRacunu ;
}
............
.............
}
AutomatNovca an = new AutomatNovca("Pera Peric", 12000.567);

double trenutoStanje = 0;
an.vratiStanjePrekoParametaraVred( trenutoStanje);


Ako se sada odštampa vrednost promenljive trenutno stanje da li će njena vrednost biti
jednaka vrednosti atributa stanjeNaRacunu?


Rezultat predavanja paremetara po vrednosti

Promenljiva trenutnoStanje će i posle pozivanja metode imati vrednost 0. Razlog toga je
što se unutar f-je vratiStanjePrekoParametaraVred kreira lokalna kopija promenljive
trenutnoStanje , dok sama promenljiva ostaje ne promenjena. Dakle ako se želi promena
vrednosti spoljašnje promenljive (koja nije članica klase) tada je ne treba prosleđivati
metodi klase po vrednosti.


Predavanje parametara po referenci

Spoljašnji objekat ili promenljiva koja je argument funkcije se može promeniti samo ako
se predaje po referenci. Predavanje vrednosti po referenci vrši se korišćenjem službene
reči ref. Tada se prilikom pozivanja metode ne pravi lokalna kopija promenljive već se
radi sa referencom na objekat. Referencu treba shvatitia kao nadimak (engl. alias) za
stvarni objekat i sve što se dešava sa referencom dešava se i sa stvarnim objektom.


Primer predavanja parametara po referenci

Pri pozivu metode kojoj se promenljiva prosleđuje po referenci se takođe koristi službena
reč ref. Promenljiva trenutoStanje prethodno inicijalizovana na nulu se prosleđuje po
referenci. Posle izvršavanja ove metode vrednost promenljive trenutoStanje se menja.

double trenutnoStanje = 0;
an.vratiStanjePrekoParametaraRef(ref trenutoStanje);

Promenljiva koja se prosleđuje po refrenci mora biti inicijalizovana. Ukoliko se ne želi
prethodna inicijalizacija promenljive koja će biti predata po referenci onda se koristi
službena reč out.


Objekat kao argument funkcije

Objekti klase se uvek predaju nekoj funkciji po referenci, što znači da objekat može
promeniti vrednost svojih atributa ako se preda nekoj funkciji. U nastavku je prikazana
klasa Omotac koja ima samo jedan atribut tipa double, objekti ovakve klase se često
nazivaju “umotani double”.

Copyright © Link group

public class Omotac
{
public double omotacStanja ;
public Omotac()
{
omotacStanja = 5 ;
}
}

Unutar klase AutomatNovca je sada napravljena metoda koja kao ulazni parametar ima
objekat klase Omotac. U telu metode se njegovom atributu omotacStanja dodeljuje
vrednost atributa stanjeNaRacunu klase AutomatNovca.

public void vratiStanjePrekoObjekta(Omotac om)
{
om.omotacStanja = stanjeNaRacunu ;
}


Primer prosleđivanja objekta kao argumenta funkcije

AutomatNovca an = new AutomatNovca("Pera Peric", 12000.567);
Omotac umotaniDouble = new Omotac();
........
an.vratiStanjePrekoObjekta(umotaniDouble);
Console.WriteLine("Sada umotana promenljiva ima vrednost " +
umotaniDouble.omotacStanja);

U primeru su najpre instancirane klase AutomatNovca i klasa Omotac. Objekat klase
Omotac označen sa umotaniDouble se prosleđuje metodi vratiStanjePrekoObjekta. Zbog
činjenice da se objekti prosleđuju po referenci atributi objekta umotaniDouble se
menjaju što se može proveriti štampanjem vrednosti atributa na standardnom izlazu.


Funkcija koja vraća objekat

Unutar klase se može napraviti metodakoja kao povratnu vrednost ima objekat neke
druge klase. To je slučaj i ovde sa metodom vratiObjekat unutar klase AutomatNovca.
Ova metoda vraća objekat klase Omotac. Unutar tela metode se vrednost jedinog
atributa ove klase setuje na vrednost stanjeNaRacunu klase AutomatNovca. Iščitavanjem
vrednosti atributa vraćenog objekta se može pročitati vrednost atributa stanjeNaRacunu
klase AutomatNovca.

public Omotac vratiObjekat()
{
Omotac tOm = new Omotac();
tOm.omotacStanja = stanjeNaRacunu ;
return tOm ;
}


Statički članovi klase

Statički članovi klase pripadaju klasi a ne objektima klase. Inicijalizuju se pre nego što se
kreira instanca klase. Pristupa im se preko imena klase. Statički mogu biti i atributi i
metode klase. Svi objekti klase dele statičke članove klase. Deklarišu se korišćenjem
službene reči static. Dat je primer upotrebe statičkog člana klase.

Copyright © Link group

public class AutomatNovca
{
public string imePrezime;
public double stanjeNaRacunu;
public static int brojRacuna = 0;
public AutomatNovca()
{
brojRacuna ++ ;
}
........
}

Atribut brojRacuna je statički što znači da ga dele svi objekti klase AutomatNovca. U
konstruktoru klase AutomatNovca inkrementira se ovaj statički član. Kad god se kreira
objekat klase AutomatNovca inkrementira se statički član brojRacuna tako da je vrednost
ovog člana u svakom trenutku jednaka broju kreiranih objekata klase AutomatNovca tj.
broju kreiranih tekućih računa.


Upotreba statičkog člana

Statički član se inicijalizuje na vrednost 20 pre kreiranja objekata klase. Zatim se kreiraju
dva objekta klase AutomatNovca. Sada je vrednost statičkog člana 22.

// inicijalizacija statickog clana pre kreiranja objekata
AutomatNovca.brojRacuna = 20 ;

// kreiranje objekata
// pri kreiranju svakog objekta inkrementira se staticki clan

AutomatNovca an1 = new AutomatNovca();
AutomatNovca an2 = new AutomatNovca();
Console.WriteLine(AutomatNovca.brojRacuna);

// rezultat : brojRacuna = 22


Definisanje prava pristupa članovima klase

Korišćenjem modifikatora može se definisati pravo pristupa članovima klase unutar
aplikacije.


Tabela 1: Prava pristupa
Kod public prava pristupa, pristup nije ograničen. Svaka druga klasa može pristupati
javnim članovima date klase.

Copyright © Link group

Privatnim članovima klase mogu pristupati samo drugi članovi te iste klase. Internal
pravo pristupa je ograničeno na prostor imena. Kod protected prava pristupa pristup je
ograničen na članove pripadajuće klase kao i na članove klase koja je izvedena iz te
klase.


Svojstva (Properties)

Svojstva su članovi klase koji omogućavaju pristup člnovima objekta neke klase.
Svojstva se prave da bi se korisniku olakšao pristup privatnim članovima klase.
Privatnom članu klase se ne može pristupiti spolja preko operatora tačka. Da bi se
pročitala vrednost privatnog člana potrebno je napraviti javnu metodu članicu klase koja
to može da uradi , pa mu se pristupa indirektno preko pristupne odnosno aksesorske
metode. Slično je i sa setovanjem vrednosti privatnog člana. Property ili svojstvo u sebi
objedinjuje ove dve funkcionalnosti. On ima get deo pomoću kga se čita vrednost
privatnog člana i set deo pomoću koga se setuje vrednost privatnog člana. Oznaka
stanjeNaRacunu = value označava da će promenljiva stanjeNaRacunu biti setovana na
vrednost sa desne strane jednakosti. Properti ima povratni tip kao i promenljiva za koju
se pravi. Obično se označava velikim početnim slovom. Uočiti da property nema male
zagrade kao metoda.

public class AutomatNovca
{
public string imePrezime;
private double stanjeNaRacunu;

// property za privatnu promenljivu stanjeNaRacunu

public double Stanje
{
get
{
return stanjeNaRacunu;
}
set
{
stanjeNaRacunu = value ;
}
}
}


Korišćenje Property-ja

U nastavku je ilustrovana upotreba propertija Stanje definisanog u prethodnom primeru.
Kada se napiše izraz an.Stanje = 23000 koristi se set deo propertija stim što je value =
23000. Ukoliko posle pozivanja propertija nema znaka jednakosti i izraza na desnoj strani
koristi se get deo propertija.

AutomatNovca an = new AutomatNovca();
an.imePrezime = "Pera Peric";

// an.stanjeNaRacunu = 23000;
// ne radi jer je atribut stanjeNaRacunu privatan

// koristim set property(value = 23000)
an.Stanje = 23000 ;


Copyright © Link group

// sada koristim get property da procitam stanje

Console.WriteLine("Korisnik " + an.imePrezime + " " + "ima na racunu : " +
an.Stanje + " dinara");

Sign up to vote on this title
UsefulNot useful