luni, 30 noiembrie 2015

Lecța 10 Proprietăți și indexatori. This.


PROPRIETĂȚI


Proprietatea este un membru de tip  metodă al clasei care ne permite să accesăm în citire sau în scriere  o dată membru privată sau protejată  a  clasei folosind o sintaxă intuitivă, ca și cum am accesa o dată publică.  Proprietatea este o metodă cu o sintaxă deosebită, în corpul căreia se găsesc două sub-metode speciale numite accesori,  get și setGet citește valoarea datei, set o modifică.

particularitățile proprietăților:
  • sunt metode fără listă de parametri formali. Semnătura lor conține numai tip și nume.
  • tipul este identic cu tipul datei membru asociate.
  • accesorul set are un parametru implicit cu numele value care se folosește de regulă în atribuirea variabilă = value.
  • numele proprietății este recomandat să fie același cu numele datei asociate, cu diferența că prima literă trebuie să fie majusculă.
  • numele variabilei nu este menționat nicăieri la apel, ci doar numele proprietății. De aici rezultă accesul la date private și protejate.


namespace Proprietati
{
    class ClasaMea
    {
        private int x;
        public int P
        {
            get
            {
                Console.WriteLine("get");
                return x;
            }
            set
            {
                Console.WriteLine("set");
                x = value;
            }
        }
    }
    class Program
    {
        public static void Main()
        {
            ClasaMea obiect = new ClasaMea();
            //linia urmatoare apeleaza accesorul
            //'set' din proprietatea P si ii
            //paseaza 10 lui ‘value’
            obiect.P = 10;
            int xVal = obiect.P;
            // linia urmatoare apeleaza accesorul
            //'get' din proprietatea P
            Console.WriteLine(xVal);
            Console.ReadLine();
        }
    }
}

INDEXATORI

Fie o clasă care are un membru de tip tablou.
Indexatorii sunt metode membre ale clasei care ne  permit să aplicăm operatorul []  instanței clasei, în loc să-l aplicăm tabloului.

Sintaxa declarării indexatorului este asemănătoare cu sintaxa declarării proprietății cu unele diferențe:
  • numele indexatorului este întotdeauna cuvântul cheie this
  • lista de parametri conține obligatoriu un parametru formal care va fi folosit ca și index în tablou.
  • există accesorii get și set.
  • get nu are parametri și returnează tipul indexatorului.
  • set are un parametru implicit numit value.
  • proprietățile pot fi statice, indexatorii nu pot fi decât nestatici.
  • ca și proprietățile, indexatorii permit accesul la date private. În fapt, numele datei private nici nu apare la apelul indexatorului ci este acoperit de numele obiectului (referința la obiect).
În exemplul următor, tabloul string[] data este declarat public numai în scopul de a se putea afișa elementele lui din clasa Rezultat fără utilizarea indexatorului, în stilul clasic. Dacă  tabloul ar fi fost declarat private, nu ar fi fost posibil. Deci indexatorii au, ca și proprietățile, rolul de a permite accesul la date private.


namespace Indexatori
{
    class ClasaMea
    {
        public string[] data = new string[6];
        public string this[int index]  // in mod normal trebuia private, dar s-a pus public pentru a se
                                                      // putea afisa si fara indexator.
        {
            get
            {
                return data[index];
            }
            set
            {
                data[index] = value;
            }
        }
    }
    class Rezultat
    {
        public static void Main()
        {
            ClasaMea v = new ClasaMea();
            v[0] = "Exemplu";
            v[1] = "cu";
            v[2] = "indexatori";
            Console.WriteLine("{0} {1} {2}.", v[0], v[1], v[2]);  //acces elemente  tablou cu indexator
            Console.WriteLine("{0} {1} {2}.",v.data[0], v.data[1], v.data[2]); //acces tablou in mod clasic
            Console.ReadLine();
        }
    }
}

Cuvântul cheie this

Folosit în orice alte contexte decât într-un indexator, this este o referință către obiectul curent. Toate metodele nestatice ale clasei au această referință care se crează în momentul instanțierii obiectului sub forma 
ClasaMea obiect =  new ClasaMea(); în acest  moment se crează alias-ul this=obiect.
This se folosește în două circumstanțe:
  •  pentru a referi o dată membru a obiectului curent care a re același nume cu numele unui parametru formal a metodei.
  •  pentru a întoarce o referință către obiectul curent.
 Class Copil
{
    private string nume;
    private int varsta;
    public Copil(string nume, int varsta)  //parametrii formali au acelasi nume ca datele membru
    {
         this.nume=nume;
         this.varsta=varsta;
     }
}

Dacă scriam doar nume=nume, se făcea o auto-atribuire deoarece numele parametrului formal ascunde numele datelor membru. 

 

Niciun comentariu:

Trimiteți un comentariu