This shows you the differences between two versions of the page.
poo-is-ab:laboratoare:06 [2024/10/28 09:50] razvan.cristea0106 [Agregare] |
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 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> |