ENKAPSULACIJA

KONTROLA MOGUĆNOSTI PRISTUPA ODREĐENIM ČLANOVIMA KLASE

 

Enkapsulirati znači staviti u kapsulu u čauru objediniti nešto.

 

Enkapsulacija je objedinjavanje strukture podataka (atributa) i operacija nad podacima (metodama) u jednu nezavisnu celinu koja oderđuje klasu određenih objekata.

 

Svrha enkapsulacije jeste dvojaka. Kao prvo treba da omogući skrivanje informacija od korisnika klase i kao drugo da zaštiti objekat neke klase od neželjenog spoljnjeg uticaja. 

 

Programera (korisnika klase) treba zaštiti od detalja funkcionisanja neke klase.

Ovaj princip se već javlja i kod struktuiranog programiranja u slučaju funkcija.

Primeri enkapsulacije su: korišćenje računara, vožnja automobila.

Svim članovima klase (metodama i atributima) je moguće pristupiti unutar same klase ali direktan pristup ovim čalnovima van same klase prilikom korišćenja kreiranog objekta može biti ograničen.

 

Opšte pravilo je takvo da se omogućava pristup metodama klase i van same klase prilikom korišćenja kreiranog objekta dok je pristup atributima onemogućen.

Primer: Bankovnog računa

BankovniRačun prvi = new BankovniRačun();
prvi.stanjeRačuna = 712;

Rešenje u korišćenju metoda: Uplata, Isplata...

Pristup i promena vrednosti atributa treba da je omogućena određenim metodama u okviru klase jer u okviru metoda mogu da se definišu ograničenja da se objekat ne dovede u nedozvoljeno stanje.

 

Mogu da se definišu i specijalne meotde okviru koje su isključivo zadužene za promenu vrednosti i očitavanje vrednosti atributa. Ovakve metode se nazivaju getteri (vraćaju vrednost atributa) i setteri (postavljaju vrednost atributima).

 

Objekat neke klase komunicira sa spoljnim svetom preko odgovarajućih metoda. Metoda predstavlja interfejs (preko metoda) za korišćenje odnosno manipulaciju objektom neke klase. 

Kontrola mogućnosti pristupa određenim članovima klase ostvaruje se navođenjem odgovarajućih specifikatora pristupa:

  1. public – član klase može da se koristi i van klase
  2. private – član klase je dostupan samo unutar klase a van klase nije

Ako se specifikator pristupa ne navede ispred člana klase podrazumevani specifikator je private.

Podaci članovi (atributi) su najčešće definisani kao private(zatvoreni su za korišćenje), dok se metode definišu kao public (otvorene su za korišćenje).

class Tacka
{
    private double x;
    private double y;
  
    public double GetX(){return x;}
    public double GetY(){return y;}

    public void SetX(double xx){x= xx;}
    public void SetY(double yy){y= yy;}
    public void SetPoint(double xx, double yy){x=xx;y= yy;}
    ...
}

Tacka A = new Tacka();
A.SetX(8.5);
A.SetPoint(5.8,4.5);

Prepravite zadata za rad sa geometrijskim figurama tako da se onemogući direktan pristup atributima klase van klase već za pristup koristite odgovarajuće funkcije za čitanje i modifikaciju njihovih vrednosti.

KONSTRUKTORI

Konstruktor je specijalna metoda koja nije u pravom smislu članica klase koja se poziva kada se kreira (definiše) neki objekta te klase. Ima isti naziv kao klasa (naziv mora da mu se poklapa sa nazivom klase) ali nema povratnu vrednost.

Konstruktor se najčešće koristi za dodeljivanje početnih vrednosti članovima klase prilikom kreiranja objekta. Unutar klase može da bude definisano više konstruktora.

Da bi mogao da se koristi nivo pristupa konstruktoru mora da bude definisan kao public.

Primer:
class Tacka
        {
            private double x;
            private double y;

            public Tacka(double xx, double yy)
            {
                x = xx;
                y = yy;
            }
....
}
Tacka t = new Tacka (5, 0);

Operator new vrši alokaciju memorije za objekat klase Tacka, a metoda (konstruktor) Tacka() kreira objekat inicijalizuje vrednost atributa.

Ako unutar klase nije definisan nijedan konstruktor prilikom kreiranja objekta klase poziva se ugrađeni konstruktor koji je bez parametara. Ovaj konstruktor sve numeričke atribute inicijalizuje na nulu a stringove i objekte na null, a logičke atribute na false ili na određene konstantne vrednosti ukoliko se atributima klase unutar tela konstruktora dodeljuju te vrednosti. .

Napomena: Prilikom definicije objekta novokreirani promenljiva predstavlja pokazivač na kreirani objekat. Ako se objekat samo deklariše promenljiva ne pokazuje ni na šta. Ako se inicijalizuje sa konstantom null onda promenljiva ne pokazuje ni na jedan objekat i takva promenljiva ne može da se koristi za pristup članovima objekta.

Tacka t;

Tacka t = null;

Podrazumevani konstruktor – ovo je konstruktor bez argumenata. 

Primer:
class Tacka
        {
            private double x;
            private double y;

            public Tacka()
            {
		Console.WriteLine("Podrazumevani konstruktor!!!!");
        		x=1.0;
            }
....
}
Tacka t1 = new Tacka ();

Parametrizovani konstruktor - ovo je konstruktor sa argumentima

class Tacka
        {
            private double x;
            private double y;

            public Tacka(double xx, double yy)
            {
                x = xx;
                y = yy;
            }
....
}

Tacka t = new Tacka (5, 0);

Konstruktor kopije – ovaj konstruktor kreira novi objekat na osnovu već postojećeg. 

Primer:
class Tacka
        {
            private double x;
            private double y;

            public Tacka(double xx, double yy)
            {
                x = xx;
                y = yy;
            }
	     public Tacka(Tacka t)
            {
                x = t.x;
                y = t.y;
            }
....
}
Tacka t1 = new Tacka (5, 0);
Tacka t2 = new Tacka (t1);

Ukoliko postoji samo ugrađeni ili postoji i podrazumevani kontruktor (među eventulano drugim kontruktorima) i ukoliko je pristup atributima klase public tada se vrednosti atributa mogu inicijalizovati i prilikom poziva podrazumevanog konstruktora na ovakav nači:

Tacka t = new Tacka() { x = 5, y = 8 };

Zadatak: u prethodnom zadatku vezanom za geometrijske figure promeniti modifikator pristupa za članove atribute na private i definišite sva tri konstruktora za klase: pravougaonik, krug, trougao i romb. Definišite odgovarajuće metode za pristup atributima klase (očitavanje i promenu njihove vrednosti.)

Domaći:Definiši sva tri konstruktora za klasu Predmet koja je definisana u skripti. Promenite modifikatore pristupa atributima klase i definišite odgovarajuće metode za pristup atributima klase (očitavanje i promenu njihove vrednosti.)

NAČIN NA KOJI SE OBJEKAT ČUVA U MEMORIJI

Tacka t1 = new Tacka(5, 8);
Tacka t2 = new Tacka(9, 7);

Console.WriteLine("Tacka t1 ima koordinate x:{0}, y:{1}",t1.GetX(),t1.GetY());
Console.WriteLine("Tacka t2 ima koordinate x:{0}, y:{1}", t2.GetX(), t2.GetY());

t2 = t1;

Console.WriteLine("Tacka t1 ima koordinate x:{0}, y:{1}", t1.GetX(), t1.GetY());
Console.WriteLine("Tacka t2 ima koordinate x:{0}, y:{1}", t2.GetX(), t2.GetY());

t2.SetX(10);
t2.SetY(10);


Console.WriteLine("Tacka t1 ima koordinate x:{0}, y:{1}", t1.GetX(), t1.GetY());
Console.WriteLine("Tacka t2 ima koordinate x:{0}, y:{1}", t2.GetX(), t2.GetY());

Objekat kao argument funkcije

static void Main(string[] args)
{

   Tacka t1 = new Tacka(5, 8);
   Console.WriteLine("Tacka t1 ima koordinate x:{0}, y:{1}", t1.GetX(), t1.GetY());
   Translacija(t1);
   Console.WriteLine("Tacka t1 ima koordinate posle translacija x:{0}, y:{1}",      
                      t1.GetX(), t1.GetY());
   Console.ReadKey();
}

 static void Translacija(Tacka t)
 {
      Console.WriteLine("Unesite vrednost za koju hocete da pomerite tacku po x-osi:");
      int x = Convert.ToInt32(Console.ReadLine());
      Console.WriteLine("Unesite vrednost za koju hocete da pomerite tacku po y-osi:");
      int y = Convert.ToInt32(Console.ReadLine());

      t.SetX(t.GetX() + x);
      t.SetY(t.GetY() + y);
  }
static void Main(string[] args)
{
   Tacka t1 = new Tacka(5, 8);
   Console.WriteLine("Tacka t1 ima koordinate x:{0}, y:{1}", t1.GetX(), t1.GetY());
   PromenaKoordinateTacke(ref t1);
   Console.WriteLine("Tacka t1 ima koordinate posle promene koordinata x:{0}, y:{1}", 
                      t1.GetX(), t1.GetY());

   Console.ReadKey();
}

static void PromenaKoordinateTacke(ref Tacka t)
{
     Console.WriteLine("Unesite novu vrednost za x koordinatu:");
     int x = Convert.ToInt32(Console.ReadLine());
     Console.WriteLine("Unesite novu vrednost za y koordinatu:");
     int y = Convert.ToInt32(Console.ReadLine());

     Tacka tPom = new Tacka(x, y);

     t = tPom;
}

Destruktori

Promenljiva koja se koristi prilikom kreiranja objekta je pokazivač na objekat. Ukoliko promenljiva iz nekog razloga prestane da pokazuje na kreirani objekat taj objekat je nedostupan u daljem toku izvršavnja programa i nepotrebno zauzima prostor u memoriji.

 

Garbage collector je deo C# koji je zadužen da čisti memoriju od nedostupnih objekata koji nepotrebno zauzimaju memoriju. On s vremena na vreme automatski bez uticaja korisnika čisti memoriju tako što poziva ili ugrađeni ili definisani destruktor.

 

Može da se pozove eksplicitno od strane programera preko GC.Collect() metode.

Destruktor je specijalna metoda koja se poziva da bi se uništio neki objekat. Korisnik može da definiše destruktor ali ne može eksplicitno da ga pozove. Ako je definisan njega može da pozove automatski garbage collector a ako nije garbage collector će da pozove ugrađeni destruktor za taj obejkat.

Garbage collector ne može da obriše (ne može da pozove destruktor) objekat na koji pokazuje neka promenljiva jer je taj objekat još uvek u upotrebi. 

Ima smisla definisati poseban destruktor za neku klasu ukoliko je potrebno osoloboditi zauzete resurse prilikom uništavanja objekta kao što su otvoreni fajl ili otovrena konekcija ka bazi podataka koju zauzima nedostupan objekat odonosno objekat koji nije više u upotrebi. Ovi resursi ne mogu da se oslobode od strane gc.

Primer:
class Tacka
        {
            public double x;
            public double y;

            ~Tacka()
            {
		Console.WriteLine("Unistavanje objekta!!!!");
            }
....
}

Javna svojstva klase funkcije su specijalizovane metode bez argumenata koje omogućavaju čitanje i dodeljivanje vrednosti atributima unutar klase.

class Tacka
{
    private double x;
    private double y;

    public Tacka(double xx, double yy)
    {
       x = xx;
       y = yy;
    }

    public double X
    {
       set{
            x = value;
          } 
       get{
            return x;
          }	
     }  
}

Tacka t = new Tacka(5,8);
t.X=10;

JAVNA SVOJSTVA KLASE

Ukoliko se želi omogućiti da se vrednosti atributa mogu samo čitati recimo ID korisnika funkcija set može da se izostavi ili hoćemo da napravimo funkciju koja zahteva da se unesu obe koordinate tačke.

 

Takođe važi i to da ukoliko želimo samo da upisujemo vrednosti u atribute funkcija get može da se izostavi. Recimo nemamo potrebu da posebno ispisujemo ime korisnika.

 

Ukoliko su implamentirane funckije get i set ili samo get ili samo set za određene atribute ti atributi se nazivaju i svojstva (properties) klase!

Automatski implementirane funkcije javna svojstva klase.

Ukoliko želimo samo da vratimo ili da upišemo vrednost u atribut klase bez prethodnih provera onda prilikom definicije atributa možemo da navedemo da ćemo da koristimo već implementirane funkcije get i set. U ovom slučaju se atributima dodeljuje specifikator pristupa public jer su to istovremeno i metode.

class Tacka
        {
            public double x{get; set;}
            public double y {get; set;}
...
}

Tacka t = new Tacka(5,8);
t.x=10;

Zadatak: u prethdnom zadatku vezanom za geometrijske figure implemetirajte odgovarajuće GET i SET metode za pristup atributima klase.

3itsProgramiranje - Teorija-Enkaspulacija

By lanik

3itsProgramiranje - Teorija-Enkaspulacija

  • 976