NET Framework POO Click to edit Master subtitle
. NET Framework POO Click to edit Master subtitle style 1
Tematica I. Principiile OOP II. Clase – generalitati III. Metode IV. Constructori si destructori V. Supraincarcarea operatorilor VI. Proprietati VII. Mosteniri VIII. Polimorfism IX. Evenimente si delegari X. Clase si functii generice 2
Tipuri de date obiectuale Tipuri de date abstracte (ADT) – entitate caracterizată printr-o colecţie de date şi un ansamblu de operaţii aplicabile acestor date. Interfaţa unui ADT – date şi operaţii care sunt accesibile din afara tipului Instanţă a unui ADT – o concretizare a tipului respectiv Tip de date obiectual – tip de date care implementează un ADT. Exemplu: class, struct, object Obiect – instanţă a unui tip de date obiectual Metode – operaţii implementate în cadrul tipului de date Membri – date şi metode care definesc tipul de date � de tip instanţă – caracteristici fiecărui obiect � de tip clasă – caracteristici clasei (static); pot fi referiţi fără a crea instanţe Constructor – metoda apelată la crearea unei instanţe Destructor – metoda apelată la desfiinţarea unei instanţe 3
I. Principiile OOP 1. Abstractizarea – modelrea unor clase care pastreaza trasaturile esentiale obiectului real care sunt suficiente pentru realizarea scopului propus (membrii clase definesc aceste trasaturi) 2. Încapsularea - protejarea clasei - definirea nivelului de acces la membrii unei clase. 3. Moştenire (Derivare )- operaţia de extindere sau specializare a comportamentului unei clase existente, prin definirea unei clase noi (subclasă, clasă derivată, clasă descendentă) care: -moşteneşte membrii clasei de bază -redefineşte unii membri -adaugă noi membri 4. Polimorfism Semnătura (amprenta) unei funcţii – ansamblul format din numele funcţiei şi lista sa de parametri. Supraîncărcarea - definirea mai multor funcţii sau metode, cu acelaşi nume dar care trebuie să difere prin parametri -număr / tip). 4 Polimorfism - facilitate pentru clase derivate
II. Clase. Acces la nivel de clasă Modificator de acces la nivel de clasă Explicaţii Clase cărora li se poate aplica public acces nelimitat clase interioare clase conținute în spații de nume internal acces doar în clasa sau spațiul de nume care o cuprinde clase interioare clase conținute în spații de nume (modificator implicit) protected acces în clasa curentă sau în cele derivate (chiar dacă clasa derivată face parte din alt spațiu de nume) clase interioare private acces limitat la clase interioare; clase interioare (modificator implicit) protected internal acces în spațiul de nume curent în clasa conținătoare sau în tipurile derivate din clasa conținătoare clase interioare new clasa conține un membru cu același nume care este moștenit; clasele interioare sealed clasa nu poate fi moștenită clasă interioară sau nu abstract clasa nu poate fi instanțiată clase interioare sau conținute înspații de nume; 5
II. Clase. Acces la nivel de membri Modificator de acces la nivel de membri Accesibilitate membri public nelimitat; internal doar în clasa sau spațiul de nume care îi cuprinde protected în clasa curentă şi în cele derivate (chiar dacă clasa derivată face parte din alt spațiu de nume) private doar în clasa curentă; (modificator implicit de acces) protected internal în spațiul de nume curent, în clasa curentă şi în clasele derivate 6
II. Clase 1. Definirea clasei [atribut] [modificator. Acces] class [nume. Clasa][: clasa. Baza ] { …. definire membrii clasei (date, metode) …. } Exemplu: class Persoana { public int varsta; public string nume; public void Scrie. Nume(); } 2. Crearea obiectelor Nume. Clasa obiect; obiect = new Nume. Clasa(); sau Nume. Clasa obiect = new Nume. Clasa(); Exemplu: 7
II. Clase. Acces la nivel de clasă 8
II. Clase. Acces la nivel de membri Exemplu – numere complexe namespace Clase. Complex { class Complex { public double real; public double imaginar; } class Program { static void Main(string[] args) { Complex z = new Complex(); z. real = 2; z. imaginar = 3; Console. Write(z. real + " i" + z. imaginar); Console. Read. Key(); } } } 9
III. Metode namespace Clase. Complex { class Program { static void Main(string[] args) { Complex z = new Complex(); z. Citeste(); z. Scrie(); Console. Write(z. Modul()); Console. Read. Key(); double real; } double rmaginar; public void Citeste() } } { real=double. Parse(Console. Read. Line()); imaginar=double. Parse(Console. Read. Line()); } public void Scrie() { Console. Write. Line(real + " i" + imaginar); Observatie – referinta la obiectul curent: this. Membru } public double Modul() { return Math. Sqrt(real*real+imaginar*imaginar); } } 1 0
III. Metode cu parametri Definire [Modificatori de acces] Tip. Rezultat Nume. Metoda (lista de parametri formali) { codul metodei } Apel Nume. Metoda(lista parametri actuali) Parametri: 1. la definire -de intrare: -de intrare – iesire: -de iesire: Tip. Parametru nume. Parametru. Formal ref Tip. Parametru nume. Parametru. Formal out Tip. Parametru nume. Parametru. Formal 2. la apel -de intrare: -de intrare – iesire: -de iesire: nume. Parametru. Actual sau valoare ref nume. Parametru. Actual out nume. Parametru. Actual 1 1
III. Metode cu parametri de intrare namespace CMMDC { class Numere { public int Intrare. CMMDC(int a, int b) { while (a != b) if (a > b) a = a - b; class Program else { b = b - a; static void Main(string[] args) return a; { Numere nr = new Numere(); } int x, y, cmxy; } x = 21; y = 15; cmxy = 0; cmxy = nr. Intrare. CMMDC(x, y); Console. Write. Line("Dupa apel x={0}, y={1}, cmxy={2}", x, y, cmxy); } } 1 2
III. Metode cu parametri de iesire namespace CMMDC { class Numere { public void Iesire. CMMDC(int a, int b, out int cm) { while (a != b) if (a > b) class Program a = a - b; { else static void Main(string[] args) b = b - a; { cm=a; Numere nr = new Numere(); int x, y, cmxy; } } x = 21; y = 15; cmxy = 0; nr. Iesire. CMMDC(x, y, out cmxy); Console. Write. Line("Dupa apel x={0}, y={1}, cmxy={2}", x, y, cmxy); } } } 1 3
III. Metode cu parametri de intrare - iesire namespace CMMDC { class Numere { public void Intrare. Iesire. CMMDC(ref int a, int b) { while (a != b) if (a > b) class Program a = a - b; { else static void Main(string[] args) { b = b - a; Numere nr = new Numere(); } int x, y, cmxy; } x = 21; y = 15; cmxy = 0; nr. Intrare. Iesire. CMMDC(ref x, y); Console. Write. Line("Dupa apel x={0}, y={1}, cmxy={2}", x, y, cmxy); Console. Read. Key(); } } } 1 4
III. Metode - supraincarcare namespace Overloading. Fractie { class Fractie { public double numarator; public double numitor; class Program { static void Main(string[] args) { Fractie f 1 = new Fractie(); Fractie f 2 = new Fractie(); double numar; public void Aduna(double nr) f 1. Numarator = 1; f 1. Numitor = 2; Console. Write. Line("Initial, f 1 este"); f 1. Afisare(); numar = 100; f 1. Aduna(numar); Console. Write. Line("Dupa adunarea nr real {0}, f 1 este: ", numar); f 1. Afisare(); { numarator = numarator+numitor*nr; } public void Aduna(Fractie f) { f 1. Numarator = 1; f 1. Numitor = 2; f 2. Numarator = 2; f 2. Numitor = 5; Console. Write. Line("Initial, f 1 este"); f 1. Afisare(); Console. Write. Line("Initial, f 2 este"); f 2. Afisare(); f 1. Aduna(f 2); Console. Write. Line("Dupa adunarea fractiei f 2, f 1 este: "); f 1. Afisare(); Console. Read. Key(); numarator = numarator*f. numitor + numitor * f. numarator; numitor = numitor * f. numitor; } public void Afisare() { Console. Write. Line("{0}/{1}", numarator, numitor); } } } 1 5
IV. Constructori Exemplu: Se apeleaza automat la namespace Complex crearea instantei clasei { class Complex { private int re; private int im; public Complex() { re=0; im=0; } public Complex(int i, int j) //constructor cu doi parametri { re = i; im = j; } public void Afis() { Console. Write. Line(re + "+" + im + "i"); } } class Program { static void Main(string[] args) { Complex c = new Complex(1, 2); c. Afis(); Complex d = new Complex(); d. Afis(); Console. Read. Line(); } } } 1 6
IV. Destructori Caracteristici • implementează acţiunile necesare distrugerii unei instanţe a clasei • este apelat automat • într-o clasă există un singur destructor • numele destructorului: ~Nume. Clasa • Nu are parametri şi nici modificator de acces • nu poate fi moştenit. Sintaxa ~nume. Clasa() { corp_destructor } 1 7
IV. Destructori Exemplu: namespace Mesaj { class Program { static void Main(string[] args) { Mesaj a = new Mesaj(); Console. Read. Line(); } class Mesaj { public Mesaj() { Console. Write. Line("Apel constructor"); } ~Mesaj() { Console. Write. Line("Apel destructor"); } } 1 8
V. Supradefinirea operatorilor Sintaxa public static Tip. Rezultat operator op (lista parametri) {… } op poate fi +, -, *, ++ etc. 1 9
V. Supradefinirea operatorilor class Fractie { public double numarator; public double numitor; public static Fractie operator+ (Fractie f 1, Fractie f 2) { Fractie rez=new Fractie(); rez. numarator = f 1. numitor * f 2. numarator + f 1. numarator * f 2. numitor; rez. numitor = f 1. numitor * f 2. numitor; class Program return rez; { } static void Main(string[] args) { public static Fractie operator +(Fractie f 1, double nr) Fractie f 1 = new Fractie(); { Fractie f 2 = new Fractie(); Fractie rez = new Fractie(); Fractie f 3 = new Fractie(); rez. numarator = f 1. numitor * nr + f 1. numarator; return rez; f 1. numarator = 1; f 1. numitor = 2; } f 2. numarator = 3; f 2. numitor = 5; f 3 = f 1 + f 2; public void Scrie() f 1. Scrie(); { f 2. Scrie(); Console. Write. Line(numarator+" / "+numitor); f 3. Scrie(); } Console. Read. Key(); } } 2 0
VI. Proprietati Caracteristici Permit accesul la datele membre - accesori Sintaxa class Nume. Clasa { …… private Tip data; public Tip Data { get { return data; } set { … cod care protejeaza data …. . data=value; } } Acces la camp prin intermediul proprietatii: obiect. Data 2 1
Proprietăți 2 2
VII. Moștenire Caracteristici O clasă care este moştenită se numeşte clasă de bază sau superclasă, iar o clasă care o moşteneşte pe aceasta se numeşte clasă derivată, sau subclasă, sau clasă descendentă. Clasa derivată moşteneşte toate elementele clasei de bază şişi adaugă altele proprii. Clasa derivată nu poate să şteargă nici un membru al clasei de bază. Sintaxa: class Clasa. Derivata : Clasa. De. Baza { … } 2 3
VII. Moștenire 2 4
VII. Moștenire. Apelul constructorilor din clasa de bază. Constructorul clasei derivate trebuie să facă inițializările câmpurilor în conformitate cu parametrii transmiși, chiar dacă o parte din aceste câmpuri provin din clasa de bază. Întrucât constructorii nu se moștenesc, e nevoie ca în clasa derivată să se facă un apel explicit al constructorului clasei de bază: : base(parametri-efectivi) Exemplu: class Clasa. De. Baza { protected string var; public Clasa. De. Baza(string var) //constructor { this. var = var; } } class Derivata : Clasa. De. Baza { public Clasa. De. Baza(string var) : base(var) {. . . } } 2 5
VIII. Polimorfism. Virtual şi override O clasă declarată virtuală implică faptul că o metodă implementată în ea poate fi redefinită în clasele derivate. Doar metodele virtuale ne statice şi/sau private pot fi redefinite într-o clasă derivată. Aceste metode trebuie să aibă aceeaşi signatură (nume, modificator de acces, tip returnat şi parametri). Pentru declararea unei metode ca fiind virtuală se foloseşte cuvântul cheie virtual. În clasele derivate se va folosi cuvântul cheie override pentru redefinirea metodei virtuale din clasa de bază. class Clasa. De. Baza { public virtual void Metoda() {. . . } } class Derivata : Clasa. De. Baza { public override void Metoda() {. . . } } 2 6
VIII. Polimorfism. new Pentru a specifica faptul că metoda clasei derivate este o implementare nouă a respectivei metode. metoda are aceeaşi signatură cu a celei din clasa de bază, dar dorim să menţionăm că este o metodă nouă class Clasa. De. Baza { public virtual void Metoda() {. . . } } class Derivata : Clasa. De. Baza { public new void Metoda() {. . . } } 2 7
IX. Evenimente şi delegări 2 8
IX. Evenimente şi delegări Caracteristici realizează comunicarea între obiecte: permit clasei sau obiectelor clasei să facă notificări, adică să anunţe celelalte obiecte asupra unor schimbări petrecute la nivelul stării lor. Clasa furnizoare a unui eveniment publică (pune la dispoziţia altor clase) acest lucru printr-o declarare event care asociază evenimentului un delegat, adică o referinţă către o funcţie necunoscută căreia i se precizează doar antetul, funcţia urmând a fi implementată la nivelul claselor interesate de evenimentul respectiv. Tehnica prin care clasele implementează metode (handler-e) ce răspund la evenimente generate de alte clase poartă numele de tratare a evenimentelor. Un delegat se poate defini şi în afara clasei generatoare de evenimente şi poate servi şi altor scopuri în afara tratării evenimentelor Sintaxa Definirea unui event [atribut][modificator. Acces] even tip. Delegat nume tip. Returnat - poate fi orice tip valid în C#, el specificând tipul folosit de accesorii get (tipul valorii returnate) şi set (tipul valorii atribuite). tip. Delegat – este un tip de date, derivat din clasa sigilată Delegate din spaţiul System. Definirea unui tip delegat: [atribut][modificator. Acces] delegate tip. Rezultat nume[lista. Parametri]) 2 9
X. Clase şi funcţii generice Caracteristici şabloane (templates) sau modele care ajută la reutilizarea codului. Ele descriu clase şi metode care pot lucra într-o manieră uniformă cu tipuri de valori diferite. permit definirea de funcţionalităţi şi metode care se adaptează la tipurile parametrilor pe care îi primesc, ceea ce permite construirea unui şablon. Singura diferenţă faţă de declararea în mod obişnuit a unei clase, este prezenţa caracterelor < şi >, care permit definirea tipului pe care clasa îl va avea, ca şi cum ar fi un parametru al clasei. La instanţierea clasei trebuie să declarăm tipul datelor utilizate. Tipurile generice (parametrizate) permit construirea de clase, structuri, interfeţe, delegaţi sau metode care sunt parametrizate printr-un tip pe care îl pot stoca sau manipula. 3 0
X. Clase şi funcţii generice Exemplu Să considerăm clasa Stiva care permite stocarea de elemente. Această clasă are două metode: Push() şi Pop(). public class Stiva<Tip. Element> //clasa generica { private Tip. Element[] element; public void Push(Tip. Element data) { // code corespunzator introducerii de elemente } public Tip. Element Pop() { // code corespunzator extragerii de elemente } } Stiva <char> Stiva. Mea = new Stiva<char>(); Stiva. Mea. Push("a"); char x = Stiva. Mea. Pop(); 3 1
III. Tema – definire clase. Metode Scrieti o aplicatie cu numele OOP 1, in care definiti clasa Fractie, pentru numere de forma a/b (a, b, reale), si adaugati cate o metoda care sa citeasca si respectiv sa afiseze pe ecran o astfel de fractie, precum si sa calculeze valoarea reala a numarului a/b. In Main definiti o instanta a acestei clase, cititi si afisati pe ecran o fractie ca instanta a clasei, precum si valoarea reala a fractiei. 3 2
III. Tema - Metode cu parametri Scrieti o aplicatie cu numele OOP 2, in care definiti clasa Numar, pentru numere naturale si adaugati metode care sa adune o valoare k la numarul respectiv, utilizand parametri de intrare, de intrare-iesire, si iesire. In Main definiti o instanta a acestei clase, cititi si afisati pe ecran valoarea unei variabile inainte si dupa apelul metodelor mentionate. 3 3
III. Tema - Metode supradefinite Scrieti o aplicatie cu numele OOP 3, in care definiti clasa Complex, pentru numere de forma a+bi si adaugati doua metode cu numele Aduna, pentru adunarea la nr curent a unui numar real, respectiv a unui alt nr complex. 3 4
IV. Tema Constructori si destructori Scrieti o aplicatie cu numele OOP 4, in care definiti clasa Masina, care sa memoreze date despre o masina (marca, putere motor). Adaugati destructor si constructori care sa permita definitiile: Masina m 1 = new Masina(); Masina m 2=new Masina(“Dacia”); Masina m 3 = new Masina(“Dacia”, 60); Fiecare constructor si destructorul afiseaza un mesaj. 3 5
V. Tema Supraincarcarea operatorilor Scrieti o aplicatie cu numele OOP 5, in care definiti clasa Complex, care sa memoreze date despre numere complexe. Supradefiniti operatorii + si *, care sa permita operatii de forma Complex z 1=new Complex(); Complex z 2=new Complex(); Complex z 3=new Complex(); z 3=z 1+z 2; z 3=z 1+5; z 3=z 1*z 2; z 3=z 1*5; 3 6
VI. Tema – Proprietati Scrieti o aplicatie cu numele OOP 6, in care definiti clasa Persoana, care sa memoreze date despre o persoana (nume, varsta). Adaugati proprietati (set-get) care sa nu permita setarea varstei negative. 3 7
VII. Tema – Mosteniri Scrieti o aplicatie cu numele OOP 7, in care definiti clasa Animal, care sa memoreze date despre un animal (nume, varsta) si clasa Cal, care sa mosteneasca clasa Animal, avand in plus date despre rasa. 3 8
- Slides: 38