Am văzut până acum că obiectele au proprietăți care pot fi accesate și modificate. De asemenea, am văzut că există funcții speciale numite constructori care sunt folosite pentru crearea obiectelor și că acești constructori pot și ei modifica proprietățile obiectelor.
Pe lângă proprietăți, obiectele au și un așa numit comportament. La fel ca obiectele reale, ele pot face ceva sau li se poate face ceva. Comportamentul obiectelor este definit cu ajutorul unor funcții ale obiectelor. Aceste funcții pot și ele accesa și/sau modifica proprietățile obiectului.
Pentru acest episod vom folosi un obiect care poate fi folosit pentru a păstra scorul unui meci de fotbal. Avem nevoie de două variabile care se reprezinte numărul golurilor marcate de cele două echipe: vom numi prima echipă gazde și a doua oaspeti și vom folosi proprietăți cu același nume pentru a păstra golurile. Pentru început clasa noastră ar putea arăta astfel:
1 2 3 4 |
class Scor { int gazde, oaspeti; } |
Vom crea doi constructori: unul care creează un obiect pentru începutul partidelor (scorul va fi 0 - 0) și unul care creează un obiect cu un scorul pe care îl dorim (specificăm numărul golurilor marcate de cele două echipe).
1 2 3 4 5 6 7 8 9 10 11 |
Scor() { gazde = 0; oaspeti = 0; } Scor(int goluriGazde, int goluriOaspeti) { gazde = goluriGazde; oaspeti = goluriOaspeti; } |
Acum putem crea obiecte și putem folosi scoruri. Pentru a afișa scorul, am putea scrie o funcție de genul:
1 2 3 4 |
void AfiseazaScor(Scor scor) { System.Console.WriteLine(scor.gazde + " - " + scor.oaspeti); } |
Avem o funcție care primește ca parametru un obiect Scor și folosește proprietățile acestuia pentru a scrie scorul. Dar, poate am dori ca scorul să se afișeze singur... Am vrea doar să-i spunem că dorim afișarea. Putem să adăugăm o funcție în interiorul clasei Scor care se ocupă de afișare:
1 2 3 4 |
void Afiseaza() { System.Console.WriteLine(gazde + " - " + oaspeti); } |
Această funcție realizează o simplă operație și nu returnează nimic. Putem avea funcții care furnizează informații; de exemplu, am putea dori să știm care este diferența dintre cele două echipe. O funcție care realizează acest lucru ar fi:
1 2 3 4 |
int Diferenta() { return gazde - oaspeti; } |
O valoare pozitivă va indica faptul că echipa gazdă este în avantaj, una negativă va arăta faptul că oaspeții sunt în avantaj, iar valoarea zero va indica egalitate.
Cele două funcții prezentate până acum nu modifică proprietățile obiectului (spunem că nu se modifică starea acestuia). Dar, s-ar putea să avem nevoie și de modificări. De exemplu, am putea dori să avem o funcție pe care să o apelăm când echipa gazdă marchează un gol și aceasta să afișeze un mesaj și să mărească numărul golurilor echipei gazde.
1 2 3 4 5 |
void GolGazde() { System.Console.WriteLine("Gol GAZDE"); gazde++; } |
Similar, putem avea o funcție pentru un gol marcat de oaspeți:
1 2 3 4 5 |
void GolOaspeti() { System.Console.WriteLine("Gol OASPEȚI"); oaspeti++; } |
Putem avea și funcții puțin mai complicate. Să presupunem că avem nevoie de una care este apelată când se marchează un gol și echipa marcatoare este indicată cu ajutorul unei valori booleene (care va fi true dacă golul este marcat de gazde și false în caz contrar). Dacă dorim, această funcție poate folosi funcțiile deja scrise:
1 2 3 4 5 6 7 8 9 10 11 |
void Gol(bool gazde) { if (gazde) { GolGazde(); } else { GolOaspeti(); } } |
Putem avea și funcții care modifică mai multe proprietăți. De exemplu, am putea dori să resetăm scorul (pentru a începe o nouă partidă); valorile celor două proprietăți ar putea deveni 0.
1 2 3 4 5 |
void Reseteaza() { gazde = 0; oaspeti = 0; } |
Și acum, să adăugăm o funcție specială: main... Aceasta face clasa noastră să poată fi executată direct. Ați văzut-o de multe ori până acum. Pe lângă faptul că este publică și statică (nu contează acum ce înseamnă aceste lucruri) și că are ca parametru un șir de stringuri, ea este și funcția cu care va începe execuția programului. Dar, deși ea apare în interiorul obiectului Scor, ea nu poate folosi proprietățile acestuia. Dar, putem crea obiecte Scor în interiorul ei...
1 2 3 4 5 6 7 8 9 10 11 12 |
public static void Main (string[] args) { Scor scor = new Scor(); scor.Afiseaza(); scor.GolGazde(); scor.GolOaspeti(); scor.GolOaspeti(); scor.Gol(true); scor.Afiseaza(); scor.Reseteaza(); scor.Afiseaza(); } |
Vedem că am apelat deja funcțiile unui obiect. Nu e nicio surpriză aici: avem numele obiectului urmat de semnul . și apoi de apelul funcției (care poate conține argumente).
Întregul nostru program ar fi următorul:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
class Scor { int gazde, oaspeti; Scor() { gazde = 0; oaspeti = 0; } Scor(int goluriGazde, int goluriOaspeti) { gazde = goluriGazde; oaspeti = goluriOaspeti; } void Afiseaza() { System.Console.WriteLine(gazde + " - " + oaspeti); } int Diferenta() { return gazde - oaspeti; } void GolGazde() { System.Console.WriteLine("Gol GAZDE"); gazde++; } void GolOaspeti() { System.Console.WriteLine("Gol OASPEȚI"); oaspeti++; } void Gol(bool gazde) { if (gazde) { GolGazde(); } else { GolOaspeti(); } } void Reseteaza() { gazde = 0; oaspeti = 0; } public static void Main (string[] args) { Scor scor = new Scor(); scor.Afiseaza(); scor.GolGazde(); scor.GolOaspeti(); scor.GolOaspeti(); scor.Gol(true); scor.Afiseaza(); scor.Reseteaza(); scor.Afiseaza(); } } |