Clase in detaliu
Ne vom focusa acum pe utilizarea claselor. Programarea orientata pe obiecte organizeaza codul si datele in obiecte. Dupa cum am vazut, clasele pot contine campuri (fields), proprietati (properties), contructori (constructors) si metode (methods) cu diferiti modificatori de acces.
- Campuri - sunt intrarile din structura obiectului asa cum se gasesc in memoria programului. Se scriu cu Pascal-Case in afara de situatia in care sunt private, atunci sunt scrise cu "_" in fata si restul Camel-Case.
- Metode - sunt functiile asociate clasei. Se scriu cu Pascal-Case.
- Contructori - sunt functii (in general, depinzand de limbaj pot avea alte nuante pentru interpretare) speciale care sunt apelate la crearea obiectului dupa ce zona de memorie a fost alocata prin cuvantul cheie new pentru a instantia obiectul. Se scriu cu Pascal-Case.
- Proprietati - Sunt metode speciale fara parametri expliciti care sunt accesate ca compurile dar de fapt sunt apelate intern ca functii. Proprietatile sunt echivalentul la getter si setter din Java sau alte limbaje dar le unesc sub o forma unica. Proprietatile au avantajul ca ascund computatii care se pot face la setare sau citire de variabile si pot avea sau nu compuri care sa le sprijine. Se scriu cu Pascal-Case.
Mai jos este un exemplu de clasa cu diferite campuri, proprietati si metode cu modificatori de acces si cuvinte cheie.
/*
* "internal" pentru clase si campuri face ca aceasta clasa sa fie vizibila doar in interiorul assembly-ului curent.
*/
internal class TestClass {
// "public" face sa fie vizibil oriunde poate fi vizibila clasa iar const pentru primitive este echivalentul la "static readonly".
public const int Constant = 42;
/* "readonly" face sa poata fi un camp doar initializat de catre un constructor si sa nu se mai poata fi schimbat.
* "private" face ca acest camp sa poata fi vazut doar de catre clasa care il contine.
*/
private readonly string _privateField;
// Se pot crea proprietati care sunt functii.metode care pot fi folosite ca membri dar sunt mereu calculati la fiecare citire.
public string DoubledProperty => _privateField + _privateField;
// Se pot crea proprietati care sa aiba getter si setter implicit pentru a lua si a seta valoare din spate fara un camp explicit declarat.
public int SecondProperty { get; set; }
private string _backedField;
/* Se pot face si proprietati care seteaza campuri private si implicand o computatie pe un camp in spate (backed field).
* Cuvantul cheie "value" la setter reprezinta valoarea data la scriere.
*/
public string ThirdProperty { get => _backedField; set => _backedField = value + value; }
public TestClass(string privateField)
{
_privateField = privateField;
}
/* Ca metoda non-statica exista referinta la propriile campuri, metode si proprietati
* si poate fi folosit referinta la propria instanta prin "this".
*/
public TestClass ConcatStringAndReturn(string other)
{
return new TestClass(this._privateField + other);
}
/* Pentru orice metoda putem acea un overload, o metoda cu acelasi nume
* dar lista de parametri cu tipuri diferite
*/
public TestClass ConcatStringAndReturn(TestClass other)
{
return new TestClass(this._privateField + other._privateField);
}
/* In metoda statica marcata prin cuvantul cheie "static" se pot referentia campuri private din clasa
* dar nu se poate refentia cuvantul cheie "this" pentru ca o metoda statica nu este legata de o instanta de obiect
*/
public static TestClass ConcatClasses(TestClass a, TestClass b)
{
return new TestClass(a._privateField + b._privateField);
}
}
Modificatori de acces
Exista diferiti modificatori de acces pentru clase, metode si campuri. Modificatorii de acces au ca rol sa restrictioneze accesul din diferite parti ale codului. Practic, programatorul se asigura ca datele dintr-o clasa sa nu poata fi accesate in alta parte a codului pentru ca altfel se pot produce erori. Principalii modificatori de acces sunt:
- public – orice cu acest modificator de acces este vizibil in tot codul sursa.
- protected – clasa sau membrul din clasa poate fi accesat doar de catre clase care o mostenesc (vedeti mostenire).
- private – clasa sau membri sai pot fi vazut doar de catre aceasta.
- internal – numit si default, daca nu este pus explicit un modificator de acces se pune acesta. Face ca clasa sau membri sai sa fie vizibili doar in propriul assembly, adica in propriul executabil sau in biblioteca care rezulta in urma compilarii.
O sumarizare a moficatorilor de acces este urmatoarea:
Locatia accesului | public | protected internal | protected | internal | private protected | private |
---|---|---|---|---|---|---|
In interiorul clasei | ✔️ | ✔️ |