clase si obicete. proprietati

3
1 Lab 5 Clase şi obiecte. Proprietăţi. 1. Obiective Declararea unei clase, instanţierea de obiecte, accesul la membri. Declarare si utilizare proprietati 2. Clase - câmpuri, metode, tipuri imbricate (vezi lab. 4) și proprietăți [modificatori_clasă] class NumeClasă [:NumeClasăDeBază[, NumeInterfață_1][,...][, NumeInterfață_N]] {//BEGIN CLASS DECL //Declarare câmpuri [specificator_de_acces] [modificatori_membru] tip_de_date _numeCâmp [= secvență_inițializare]; //Declarare proprietăți //- o proprietate simplă trebuie să conțină cel puțin un setter sau un getter [specificator_de_acces] [modificatori_membru] tip_de_date NumeProprietateSimplă { //declarație getter – întoarce valoarea unui anumit câmp sau a unei expresii //- o proprietate simplă trebuie să conțină cel puțin un setter sau un getter [specificator_de_acces] get { //zonă cu instrucțiuni //instrucțiunea de returnare a unei valori a cărei tip este la fel cu cel al proprietății return _valoare; } //declarație setter //- specificatorul de acces permite restricționarea accesului la operațiile posibile asupra //proprietății (ex: putem face citirea publică și setarea protejată) [specificator_de_acces] set { // - instrucțiune de atribuire a valorii atribuite proprietății („value”) unui câmp //neaccesibil din clasă, sau mai multe instrucțiuni în funcție de necesitate // - se pot utiliza instrucțiuni condiționale pentru a valida o atribuire înainte de //modificarea câmpului restricționat _valoare = value; } } //- o proprietate automată trebuie să conțină un setter și un getter, în caz contrar definirea //sa nu ar avea sens //- pentru această proprietate se generează un câmp privat în mod automat [specificator_de_acces] [modificatori_membru] tip_de_date NumeProprietateAutomată { [specificator_de_acces] get; [specificator_de_acces] set; } //Declarare metode [specif_de_acces] [modif_membru] tip_de_date NumeMetodă ([tip_de_date numeParam1], ... , [tip_de_date numeParamN], [...]) { //- zonă pentru declarări de variabile și instrucțiuni //- instrucțiunea return, care întoarce o valoare de același tip cu al metodei. În cazul în //care metoda nu întoarce nici o valoare tipul său e „void” și return poate lipsi return _valoare; } //Declarare tipuri imbricate [specif_de_acces] [modif_clasă] class NumeClsImbricată [:[NumeClsDeBază],[NumeInterf_1],[...], [NumeInterf_N]] { //declarații membri clasă imbricată } }//END CLASS DECL

Upload: coroiuadrian

Post on 16-Jan-2016

3 views

Category:

Documents


0 download

DESCRIPTION

Clase si obicete. Proprietati

TRANSCRIPT

Page 1: Clase si obicete. Proprietati

1

Lab 5

Clase şi obiecte. Proprietăţi.

1. Obiective

Declararea unei clase, instanţierea de obiecte, accesul la membri.

Declarare si utilizare proprietati

2. Clase - câmpuri, metode, tipuri imbricate (vezi lab. 4) și proprietăți

[modificatori_clasă] class NumeClasă [:NumeClasăDeBază[, NumeInterfață_1][,...][, NumeInterfață_N]] {//BEGIN CLASS DECL //Declarare câmpuri [specificator_de_acces] [modificatori_membru] tip_de_date _numeCâmp [= secvență_inițializare]; //Declarare proprietăți //- o proprietate simplă trebuie să conțină cel puțin un setter sau un getter [specificator_de_acces] [modificatori_membru] tip_de_date NumeProprietateSimplă { //declarație getter – întoarce valoarea unui anumit câmp sau a unei expresii //- o proprietate simplă trebuie să conțină cel puțin un setter sau un getter [specificator_de_acces] get { //zonă cu instrucțiuni //instrucțiunea de returnare a unei valori a cărei tip este la fel cu cel al proprietății return _valoare; } //declarație setter //- specificatorul de acces permite restricționarea accesului la operațiile posibile asupra //proprietății (ex: putem face citirea publică și setarea protejată) [specificator_de_acces] set { // - instrucțiune de atribuire a valorii atribuite proprietății („value”) unui câmp //neaccesibil din clasă, sau mai multe instrucțiuni în funcție de necesitate // - se pot utiliza instrucțiuni condiționale pentru a valida o atribuire înainte de //modificarea câmpului restricționat _valoare = value; } } //- o proprietate automată trebuie să conțină un setter și un getter, în caz contrar definirea //sa nu ar avea sens //- pentru această proprietate se generează un câmp privat în mod automat [specificator_de_acces] [modificatori_membru] tip_de_date NumeProprietateAutomată { [specificator_de_acces] get; [specificator_de_acces] set; } //Declarare metode [specif_de_acces] [modif_membru] tip_de_date NumeMetodă ([tip_de_date numeParam1], ... , [tip_de_date numeParamN], [...]) { //- zonă pentru declarări de variabile și instrucțiuni //- instrucțiunea return, care întoarce o valoare de același tip cu al metodei. În cazul în //care metoda nu întoarce nici o valoare tipul său e „void” și return poate lipsi return _valoare; }

//Declarare tipuri imbricate [specif_de_acces] [modif_clasă] class NumeClsImbricată [:[NumeClsDeBază],[NumeInterf_1],[...], [NumeInterf_N]] { //declarații membri clasă imbricată }

}//END CLASS DECL

Page 2: Clase si obicete. Proprietati

2

3. Exemplu cu proprietăți explicat using System; namespace FabriciDeNumereComplexe { public class Complex { private double _re; //câmp privat, partea reală //proprietate publică pentru acces la partea reală public double Re { //getter public - poate fi utilizat de oriunde get { return _re; } //setter privat - poate fi setat doar din interiorul clasei private set { _re = value; } } //proprietate automată - partea imaginară public double Im { get;//getter public private set;//setter privat } public double Modul { get { return //ex: utilizare câmp privat și proprietate automată Math.Sqrt(_re * _re + Im * Im); } //fără setter! } public double Fază { get { return Math.Atan2(Im, _re); } //fără setter! } //metodă ce crează obiecte Complex utilizând coordonate carteziene public static Complex FabricaDinCoordCarteziene(double re, double im) { return new Complex(re, im); } //metodă ce crează obiecte Complex utilizând coordonate polare public static Complex FabricaDinCoordPolare(double modul, double faza) { double im; //calculare parte imaginara, stocare in variabila im im = modul * Math.Sin(faza); //directiva de returnare a unei valori return //- formarea valorii prin construcția unui obiect Complex //utilizând parametri modul și faza //- re pasat prin expresie, im pasat prin variabila precalculata new Complex(modul * Math.Cos(faza), im); } //constructor privat - doar cu o metodă din clasă putem crea obiecte private Complex(double re, double im) { //- utilizâm proprietatea Re pentru a atribui câmpului _re valoarea //parametrului re Re = re;

Page 3: Clase si obicete. Proprietati

3

//- atribuim proprietății automate valoarea parametrului im Im = im; } } class Program { static void Main(string[] args) { Complex x = Complex.FabricaDinCoordPolare(1, Math.PI); //acces la campurile lui x prin proprietatile Re si Im Console.WriteLine("X este: {0}+i*{1}", x.Re, x.Im); Complex y = Complex.FabricaDinCoordCarteziene(12, 23.5); Console.WriteLine("Y este: {0}+i*{1}", y.Re, y.Im); Complex suma = Complex.FabricaDinCoordCarteziene(x.Re + y.Re, x.Im + y.Im); Console.WriteLine("Suma X+Y este: {0}+i*{1}", suma.Re, suma.Im); }//end main }//end class Program }//end namespace

4. APLICAȚIE! Modificați programul anterior astfel încât un obiect Complex să nu poată fi creat atunci când valoarea

părții reale sau a celei imaginare depășește 1024.

5. Utilizarea parametrilor de ieșire

Parametri de ieșire pot fi folosiți pentru a întoarce rezultate dintr-o metodă. Cuvântul cheie out, folosit în același mod ca și ref în

cazul parametrilor referință, este utilizat la declarare și apel.

Diferența dintre parametri referință și cei de ieșire este aceea că la apel, parametrii referință trebuie să aibă o valoare.

6. APLICAȚIE! Rescrieți metodele fabrică astfel încât ele să întoarcă obiectele noi de tip Complex cu ajutorul unor

parametri de ieșire, nu prin returnarea unui obiect cu instrucțiunea return.

7. Teme de casa

Realizați o aplicație care: - Definește o clasă Punct care conține 2 câmpuri private cu numele _abscisa, _ordonata, un constructor fără parametri care

inițializează _abscisa și _ordonata cu 0, proprietăți ce permit citirea celor două câmpuri și setarea lor la valori cuprinse

între 0 și 1024. Pentru definirea limitelor se vor folosi constante.

- Definește o clasă Linie care conține 2 câmpuri private de tipul Punct, cu numele _sursa, _destinatie, un constructor care

primește 2 obiecte Punct ca parametru, care au același nume cu câmpurile private (folosiți referința this pentru atribuiri) și

proprietăți care permit accesul în citire la câmpuri.

- Definește o clasă ȘirDeLiniiÎnchis care conține un tablou de obiecte de tip Linie de dimensiunea 100, o proprietate ce

permite accesul în citire la acest tablou, o metodă privată ce întoarce o valoare de tip bool true în cazul în care șirul de linii

este închis sau false în caz contrar, o metodă publică AddLine ce permite adăugarea unei linii la sfârșitul șirului dacă

aceasta vine în continuarea liniei adăugată anterior (prev._destinatie == new._sursa) și care întoarce o valoare de tip bool

true dacă adăugarea a avut loc sau false în caz contrar (se va ține cont de limitări, a 100-a linie trebuie neaparăt să ducă la formarea unui șir închis, altfel nu poate fi adăugată). Se va adăuga o metodă publică ce permite citirea unei linii în funcție

de indexul său din șirul de linii, furnizat ca parametru.

- Definește o clasă Program ce conține metoda Main, în care se citesc Linii atâta timp cât ele sunt una în continuarea

celeilalte sau până când rezultatul formează un șir de linii închis, utilizând o instanță a clasei ȘirDeLiniiÎnchis. Utilizați

toate elementele create de voi.

Pornind de la exercițiile pregătitoare, modificaţi clasa Produs astfel încât la fiecare instanţiere obiectul instanţiat să fie păstrat

într-un tablou de produse declarat în interiorul clasei (maxim 100 de produse, tabloul să fie acelaşi pentru toate insţantele

(membru static)). Să se modifice metodele StocProducator şi StocValoric astfel încat ele să opereze pe tabloul din clasă şi nu pe

parametri variabili. Sugestie: alocaţi un tablou de 100 de produse şi gestionaţi voi lungimea şi fiecare element în parte.

Creaţi o metodă ce întoarce un nou şir ce va conţine doar produsele ce au fost alocate.

Pornind de la exemplul 1 din documentul cu exerciții pregătitoare, să se introducă proprietăţi pentru translatarea coordonatelor carteziene în coordonate polare.