14.11. (lekcija) Ključna reč this, enkapsulacija, get i set metode u C#
1. Podsetite se: Zašto nam treba enkapsulacija?
Pre nego što se upoznamo sa ključnom rečju this i metodama get i set, prvo treba da se podsetimo zašto objektno programiranje uvodi koncept enkapsulacije i šta je to.
Enkapsulacija znači pakovanje podataka i funkcija koje rade nad tim podacima u jednu celinu – klasu. Ideja je da objekat štiti sopstvene podatke tako što spoljašnji korisnik objekta ne može tek tako da ih menja, osim na način koji mi dozvolimo.
To znači da se podaci i metode koji pripadaju nekom objektu drže zajedno, „u paketu“. Još važnije, spolja ne moramo da vidimo ili znamo sve detalje kako nešto radi.
Zamislite vozača automobila: on vidi volan, pedale i menjač. Kada pritisne gas, auto ubrzava. Ali vozač ne mora da zna šta se tačno dešava u motoru. Ti detalji su „sakriveni“ – enkapsulirani unutar automobila.
To u praksi znači da:
-
atributi obično nisu javni, jer bi to omogućilo da se vrednosti menjaju nasumično.
-
umesto toga koristimo metode (get/set) koje proveravaju da li je promena dozvoljena.
To je kao da u kući imate sef ili kasicu: šifru ne dajete svima, ali im umesto toga ponudite način da ubace novac kroz mali otvor –> svi mogu da dodaju novce ali ne mogu svi da im pristupe.
2. Ključna reč this
Ključna reč this označava tekući objekat — onaj objekat nad kojim se trenutno izvršava metoda, odnosno kada objekat misli na samog sebe.
Koristimo je kada:
- Želimo da razlikujemo polje objekta od parametra istog imena
- Želimo da prosledimo trenutni objekat nekoj metodi ili konstruktoru
- Pristupamo članovima klase iznutra (jasnije i bez greške)
Za učenike sada je najvažniji prvi slučaj: kako da se razlikuju atributi klase i parametri metoda/konstruktora ako imaju isto ime
Primer bez this (gde se nailazi na problem)
class Ucenik
{
private string ime;
public Ucenik(string ime) //parametar se isto zove kao i polje klase
{
ime = ime; // OVO NE RADI KAKO TREBA! - oba se odnose na parametar
}
}
Ovde kompajler misli da oba ime predstavljaju parametar, ne radi kako treba - pa nema dodele vrednosti.
Rešenje -> Koristimo this
class Ucenik
{
private string ime;
public Ucenik(string ime)
{
this.ime = ime; // this.ime je polje u klasi, ime je parametar
}
}
this.ime = polje objektaime = vrednost prosleđenog argumenta u konstruktoru
this jasno pokazuje da mislimo na deo koji pripada objektu.
Enkapsulacija = skrivanje podataka i kontrola pristupa tim podacima.
Zašto se koristi?
-
da zaštitimo podatke objekta
-
da sprečimo neispravne vrednosti
-
da kontrolišemo kako se podaci menjaju (validacija)
-
da se klasa koristi bez uvida u njenu unutrašnjost
U praksi → polja postaju private, a pristup omogućavamo get/set metodama.
Bez enkapsulacije (loša praksa):
class BankovniRacun
{
public double Stanje; // svako može promeniti direktno
}
Korisnik bi mogao da napiše:
racun.Stanje = -9999;
Što nema smisla.
3. Enkapsulacija u praksi
Enkapsulacija se najčešće radi tako što:
-
atribute pišemo kao
private -
dozvoljavamo pristup kroz javne metode (često set i get)
4. Get i Set metode (klasičan način)
(Pre nego što naučimo svojstva — properties)
U starijem i osnovnom pristupu enkapsulaciji koristimo:
-
get metodu – vraća vrednost polja (privatnog atributa klase)
-
set metodu – menja polje, sa validacijom
Primeri:
Klasa Krug
class Krug
{
private double poluprecnik;
public double GetPoluprecnik()
{
return poluprecnik;
}
public void SetPoluprecnik(double vrednost)
{
if (vrednost > 0)
poluprecnik = vrednost;
}
}
Ovo omogućava:
-
da korisnik dobije podatak
-
ali kada želi da ga promeni – prolazi kroz našu validaciju (proveru da li je sve ok)
Još jedan primer je iza dugmenceta:
Klasa Student
class Student
{
private int godina;
public int GetGodina()
{
return godina;
}
public void SetGodina(int g)
{
if (g >= 1 && g <= 4)
godina = g;
else
Console.WriteLine("Greska: godina mora biti 1–4.");
}
}
Napomena: set metode ne smeju bezuslovno da prihvate vrednost.
5. Primena svega zajedno – kompletni primeri
Klasa Pravougaonik
class Pravougaonik
{
private double sirina;
private double visina;
public Pravougaonik(double sirina, double visina)
{
this.SetSirina(sirina);
this.SetVisina(visina);
}
public double GetSirina()
{
return sirina;
}
public void SetSirina(double s)
{
if (s > 0)
this.sirina = s;
else
Console.WriteLine("Sirina mora biti > 0");
}
public double GetVisina()
{
return visina;
}
public void SetVisina(double v)
{
if (v > 0)
this.visina = v;
else
Console.WriteLine("Visina mora biti > 0");
}
public double Povrsina()
{
return sirina * visina;
}
}
Korišćenje ove klase:
Pravougaonik p = new Pravougaonik(10, 5);
Console.WriteLine(p.Povrsina()); // 50
p.SetVisina(-2); // ispis: "Visina mora biti > 0"
Klasa Ucenik
class Ucenik
{
private string ime;
private double prosek;
public Ucenik(string ime, double prosek)
{
this.ime = ime; // this → polje = parametar
this.prosek = prosek;
}
public void SetIme(string ime)
{
if (ime.Length > 0)
this.ime = ime;
}
public string GetIme()
{
return this.ime;
}
public void SetProsek(double p)
{
if (p >= 1 && p <= 5)
this.prosek = p;
else
Console.WriteLine("Prosek mora biti izmedju 1 i 5!");
}
public double GetProsek()
{
return this.prosek;
}
}
Upotreba:
Ucenik u = new Ucenik("Marko", 4.5);
Console.WriteLine(u.GetIme()); // Marko
u.SetProsek(6); // ✖ greška
u.SetProsek(5); // ✔ ok
Ukratko:
-
thispokazuje na objekat koji je trenutno u upotrebi -
enkapsulacija štiti podatke objekta
-
set/get metode služe za kontrolisani pristup atributima
| Pojam | Objašnjenje |
|---|---|
this |
Oznaka za tekući objekat |
| Enkapsulacija | Sakrivanje podataka i kontrolisan pristup |
| private polja | Podaci koje korisnik direktno ne vidi |
| Get metoda | Vraća vrednost privatnog polja |
| Set metoda | Menja privatno polje uz validaciju |