This shows you the differences between two versions of the page.
poo-is-ab:laboratoare:06 [2024/10/27 21:50] razvan.cristea0106 [Concluzii] |
poo-is-ab:laboratoare:06 [2025/01/19 22:29] (current) razvan.cristea0106 |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laborator 6 - Moștenire multiplă și agregare ===== | + | ===== Laborator 06 - Moștenire multiplă și agregare ===== |
**Autor: Răzvan Cristea** | **Autor: Răzvan Cristea** | ||
Line 22: | Line 22: | ||
<note important>În general, găsirea unei combinații potrivite de clase care să respecte **moștenirea multiplă** poate fi o provocare, deoarece aceasta poate duce la situații **complexe** și **ambigue**. **Moștenirea multiplă** poate să genereze probleme atunci când două **clase părinte** au **metode** sau **membri comuni**, ceea ce poate crea **conflicte** sau **confuzie** în interpretarea acestora în **clasa copil**. Astfel, devine esențial ca **moștenirea multiplă** să fie utilizată doar atunci când **clasele părinte** sunt **bine definite**, **fără** suprapuneri de responsabilități sau funcționalități, pentru a **evita** situațiile de ambiguitate și a păstra codul ușor de întreținut și de extins.</note> | <note important>În general, găsirea unei combinații potrivite de clase care să respecte **moștenirea multiplă** poate fi o provocare, deoarece aceasta poate duce la situații **complexe** și **ambigue**. **Moștenirea multiplă** poate să genereze probleme atunci când două **clase părinte** au **metode** sau **membri comuni**, ceea ce poate crea **conflicte** sau **confuzie** în interpretarea acestora în **clasa copil**. Astfel, devine esențial ca **moștenirea multiplă** să fie utilizată doar atunci când **clasele părinte** sunt **bine definite**, **fără** suprapuneri de responsabilități sau funcționalități, pentru a **evita** situațiile de ambiguitate și a păstra codul ușor de întreținut și de extins.</note> | ||
- | Pentru acest laborator propunem ca și clase părinte **ProdusComercial** și respectiv **PiesaElectronica**, iar ca și clasă copil **CameraWeb**. Dacă am menționat **moștenire** acest lucru este echivalent cu relația de **"is-a"** ceea ce înseamnă că **orice cameră web** este un **produs comercial** și în același timp **orice cameră web** este o **piesă electronică**. | + | **Moștenirea** poate fi vizualizată ca o structură arborescentă, ceea ce explică de ce organizarea claselor într-un astfel de sistem este denumită **ierarhie de clase**. Într-o **ierarhie**, fiecare **clasă derivată** își are rădăcinile în **clasele părinte**, iar această organizare permite construirea unei structuri **logice** și **ordonate** a relațiilor dintre clase. De exemplu, în C++, putem observa în imaginea de mai jos un **arbore de fluxuri (ierarhia claselor de fluxuri)** în care clasele specifice de intrare și ieșire (precum **''ifstream''**, **''ofstream''**, **''stringstream''**) sunt derivate din clase generale precum **''istream''**, **''ostream''** sau **''iostream''**. Această structură arborescentă oferă atât claritate conceptuală, cât și flexibilitate în reutilizarea și extinderea funcționalităților claselor. |
+ | |||
+ | {{ :poo-is-ab:laboratoare:arbore_fluxuri.jpg?400 |}} | ||
+ | |||
+ | Pentru acest laborator propunem ca și clase părinte **ProdusComercial** și respectiv **PiesaElectronica**, iar ca și clasă copil **CameraWeb**. Dacă am menționat **moștenire** acest lucru este echivalent cu relația de **"is-a"** ceea ce înseamnă că **orice cameră web** este un **produs comercial** și în același timp **orice cameră web** este și o **piesă electronică**. | ||
Declarația clasei **ProdusComercial** se poate observa în blocul de cod mai jos. | Declarația clasei **ProdusComercial** se poate observa în blocul de cod mai jos. | ||
Line 75: | Line 79: | ||
#include "PiesaElectronica.h" | #include "PiesaElectronica.h" | ||
- | class CameraWeb : public ProdusComercial, public PiesaElectronica // CameraWeb mosteneste atat ProdusComercial cat si PiesaElectronica | + | class CameraWeb : public ProdusComercial, public PiesaElectronica // CameraWeb mosteneste atat clasa ProdusComercial cat si clasa PiesaElectronica |
{ | { | ||
int rezolutie; | int rezolutie; | ||
Line 249: | Line 253: | ||
==== Agregare ==== | ==== Agregare ==== | ||
- | **Agregarea** presupune ca într-o clasă să avem unul sau mai multe **atribute** de tipul **altei clase**. Când spunem **agregare** acest lucru este echivalent cu relația de "has-a" sau "has-many" în funcție de context. | + | **Agregarea** presupune ca într-o clasă să avem unul sau mai multe **atribute** de tipul **altei clase**. Când spunem **agregare** acest lucru este echivalent cu relația de **"has-a"** sau **"has-many"** în funcție de context. |
<note>Agregarea este de două tipuri după cum urmează: | <note>Agregarea este de două tipuri după cum urmează: | ||
Line 258: | Line 262: | ||
</note> | </note> | ||
- | Ca și exemplu didactic vom crea o clasă nouă denumită **Laptop** care va conține un atribut de tip **CameraWeb** punând astfel în evidență relația de **"has-a"** dintre două clase. Acestă agregare este de tip **weak**, deoarece un laptop poate să nu aibă cameră web. | + | Ca și exemplu didactic vom crea o clasă nouă denumită **Laptop** care va conține un atribut de tip **CameraWeb** punând astfel în evidență relația de tip **"has-a"** dintre două clase. Acestă **agregare** este de tip **weak**, deoarece un laptop poate să nu fie dotat cu o cameră web. |
<code cpp> | <code cpp> | ||
Line 332: | Line 336: | ||
</code> | </code> | ||
- | Iar implementarea funcțiilor din cadrul namespace-ului se poate observa mai jos. | + | Iar implementările funcțiilor din cadrul namespace-ului se pot observa mai jos. |
<code cpp> | <code cpp> | ||
Line 363: | Line 367: | ||
</code> | </code> | ||
- | Testarea acestui namespace este facută în **funcția main** după cum urmează în codul de mai jos. | + | Testarea acestui **namespace** este facută în **funcția main** după cum urmează în codul de mai jos. |
<code cpp> | <code cpp> |