programare orientată obiect - facem soft · •În limbajele puternic orientate obiect (c#, java)...

35
Programare Orientată Obiect Laborator 8

Upload: others

Post on 17-Mar-2021

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Programare Orientată Obiect

Laborator 8

Page 2: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Despre ce vorbim azi

• Moștenirea multiplă

• Funcții virtuale

• Funcții virtuale pure

• Clase abstracte

Page 3: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Moștenirea multiplă

• Limbajul C++ permite derivarea unei clase din două sau mai multe clase de bază

• Se realizează astfel o structură de tip rețea ce nu aduce întotdeauna numai beneficii

• În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă și mai multe interfețe

Page 4: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Exemplu

class A {…};

class B {…};

class C {…};

class D : public A, private B, protected C {…};

Page 5: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Precizări

• Constructorul clasei D trebuie să specifice explicit colaborare cu ceilalți constructori din clasele de bază

• Ex: D::D() : A(), B(), C() {…}

• În mod similar se procedează și pentru constructorul cu parametri și cel de copiere

Page 6: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Precizări

• În cazul în care constructorul clasei D lipsește este creat automat unul sintetizat din constructorii de bază

• În acest fel fiecare constructor din bază își inițializează zona lui de obiect

• Constructorii sunt apelați în ordinea specificată la derivare (nu în cea din definiția constructorului)

• Destructorii se apelează în ordine inversă derivării

Page 7: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Probleme ce apar la moștenirea multiplă

• Problema membrilor moșteniți cu același nume

• Problema moștenirii multiple din clase cu o bază comună

Page 8: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Problema membrilor moșteniți cu același nume

• În general este rezolvată prin utilizarea rezoluției de clasă ori de câte ori membrul moștenit este referit

• În cazul funcțiilor se poate opta și pentru redeclararea funcției comune în clasa derivată (folosind alt cod sau apelând una din funcțiile din bază)

Page 9: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Problema membrilor moșteniți cu același nume

Clasa de bază 1

Page 10: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Problema membrilor moșteniți cu același nume

Clasa de bază 2

Page 11: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Problema membrilor moșteniți cu același nume

Clasa derivată și rezolvarea ambiguității

Page 12: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Problema moștenirii multiple din clase cu o bază comună

B

A

C

D

Page 13: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Problema moștenirii multiple din clase cu o bază comună

• Problema este dată de faptul că D va moșteni membrii clasei A de două ori

• Dacă acest lucru este dorit, atunci clasele pot rămâne așa

• Dacă nu, putem rezolva problema prin utilizarea conceptului de moștenire virtuală

Page 14: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Alte precizări

• Upcasting-ul în cazul moștenirii multiple este permis din oricare din clasele derivate către clasa de bază

A *pa; B *pb; D d; pa = &d; pb = &d;• Upcasting-ul în cazul moștenirii multiple din clase cu o bază comună trebuie făcut etapizat

A *pa; D d; pa=&d; //eroareA *pa; B *pb; D d; pb = &d; pa = pb;

Page 15: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Derivarea virtuală

• Utilizată pentru a nu moșteni în duplicat membrii clasei de bază în cadrul ierarhiei de tip romb

• Se utilizează pentru clasele derivate din bază și are efect asupra claselor derivate din acestea

• Clasele derivate virtual se numesc clase virtuale (fără legătură cu acele clase ce conțin funcții virtuale sau virtuale pure)

Page 16: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Exemplu

Clasa mamă (A)

Page 17: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Exemplu

Clasa derivată 1 (B)

Page 18: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Exemplu

Clasa derivată 2 (C)

Page 19: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Exemplu

Clasa finală (D)

Page 20: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Exemplu

Ce credeți că afișează codul?

Page 21: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Exemplu

Răspuns:

Page 22: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Precizări

• Dacă folosim derivare virtuală upcasting-ul poate fi făcut direct de la clasa finală către bază (nu mai e nevoie de etapizarea lui)

• În cazul în care clasa de bază conține o funcție virtuală sau virtuală pură, aceasta trebuie obligatoriu implementată în clasa finală (altfel aceasta moștenește două implementări ale funcției virtuale, ambele pe același nivel, compilatorul semnalând ambiguitate)

Page 23: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Funcții virtuale

• Implementează cea de-a doua formă de polimorfism

• Prima formă de polimorfism era supraîncărcarea (overloading)

• Aici vorbim de conceptul de supradefinire(overriding)

• Nu pot fi statice

Page 24: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Overloading vs Overriding

• La overloading alegerea funcției potrivite se face la compilare (early binding), în cazul overriding-ului se face la execuție (late binding)

• La overloading alegerea funcției potrivite se face în funcție de prototip (numărul și tipul parametrilor), în cazul overriding-ului se face în funcție de obiectul pointat

Page 25: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Overloading vs Overriding

• Putem vorbi de overloading doar în cadrul aceleiași clase, iar de overriding doar atunci când lucrăm cu clase derivate

• Avem de-a face cu overriding doar atunci când folosim funcții virtuale (rescrierea funcțiilor în clase derivate, fără specificarea cuvântului cheie virtual în clasa de bază, nu este considerată supradefinire)

Page 26: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Exemplul 1

Clasa de bază

Page 27: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Exemplul 1

Clasa derivată 1

Page 28: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Exemplul 1

Clasa derivată 2

Page 29: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Exemplul 1

Utilizare funcții virtuale

Page 30: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Exemplul 1

Utilizare funcții virtuale

Page 31: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Exemplul 2

Funcție globală ce utilizează referință la clasa de bază

Page 32: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Exemplul 2

Apel și rezultat

Page 33: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Funcțiile virtuale pure

• Au prototipul: virtual tip nume (parametri) = 0;

• Obligă clasele ce moștenesc clasa în care există să o implementeze (neimplementarea duce la eroare de compilare)

• O clasă ce are cel puțin o funcție virtuală pură se numește clasă abstractă

Page 34: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Clasele abstracte

• Nu pot fi instanțiate (nu putem declara obiecte de tipul clasei respective)

• Acest lucru nu înseamnă că nu putem declara pointeri către clasa respectivă în care să salvăm adrese de obiecte din clase derivate (upcasting) pentru a implementa virtualizarea

Page 35: Programare orientată obiect - Facem Soft · •În limbajele puternic orientate obiect (C#, Java) moștenirea multiplă este evitată prin forțarea derivării doar din maxim o clasă

Clasele abstracte

• Implementează comportamente în general

• Constituie bază pentru derivări

• În limbajele de programare orientate obiect mai noi au fost înlocuite cu noțiunea de interfață (exemple de nume de interfețe în C#: IComparable, ICloneable)