This shows you the differences between two versions of the page.
poo-is:laboratoare:05 [2020/09/20 15:36] ruben_gilian.udroiu [Exemplu amanuntit] |
poo-is:laboratoare:05 [2020/09/29 22:26] (current) alexandru.ionita99 |
||
---|---|---|---|
Line 1: | Line 1: | ||
======= Laboratorul 05: Polimorfism. Agregare ======= | ======= Laboratorul 05: Polimorfism. Agregare ======= | ||
- | In cadrul laboratorului 5 al Programarii Orientate pe Obiecte, vom aprofunda unul dintre cele 4 principii ale POO-ului, **polimorfismul**, si un alt concept important, **agregarea**. | + | In cadrul laboratorului 5 al Programarii Orientate pe Obiecte, vom aprofunda unul dintre cele 4 principii ale POO-ului, **Polimorfismul**. De asemenea, vom aborda conceptul de **Agregare**. |
- | Ca referinte externe, recomandat urmatorul capitol din [[https://discourse-production.oss-cn-shanghai.aliyuncs.com/original/3X/2/3/2380479dcb8e375425884a10da232730bbc7f88d.pdf|Absolute C++]]: | + | Cele 4 mari concepte ale Programarii Obiectuale sunt: **Incapsulare**, **Polimorfism**, **Mostenire** si **Abstractizare**. (Echivalent in engleza, pentru documentare suplimentara: Encapsulation, Polymorphism, Inheritance, Abstraction). |
+ | |||
+ | Ca referinte externe, recomandam urmatorul capitol din [[https://discourse-production.oss-cn-shanghai.aliyuncs.com/original/3X/2/3/2380479dcb8e375425884a10da232730bbc7f88d.pdf|Absolute C++]]: | ||
* Capitolul 15 (Chapter 15: Polymorphism and virtual functions, pag. 661-693) | * Capitolul 15 (Chapter 15: Polymorphism and virtual functions, pag. 661-693) | ||
- | ===== Polimorfism ===== | + | ===== 1. Polimorfism ===== |
<note important>**Polimorfism** = abilitatea unei functii cu un anumit nume sa aiba comportamente diferite, in functie de parametrii de intrare.</note> | <note important>**Polimorfism** = abilitatea unei functii cu un anumit nume sa aiba comportamente diferite, in functie de parametrii de intrare.</note> | ||
- | <note> Semnatura unei metode consta in: | + | <note important>In C++, avem mai multe tipuri de polimorfism: |
- | * numele metodei | + | |
- | * numarul si tipul parametrilor | + | |
- | </note> | + | |
- | <note important>In C++, polimorfismul are mai multe tipuri | + | |
* Compile Time Polymorphism | * Compile Time Polymorphism | ||
* Run Time Polymorphism | * Run Time Polymorphism | ||
Line 17: | Line 15: | ||
<note>**Compile Time Polymorphism** | <note>**Compile Time Polymorphism** | ||
- | Acest tip de polimorfism este obtinut cand supraincarcarea o functie (Function Overloading) sau un operator (Operator Overloading). | + | Acest tip de polimorfism este obtinut prin supraincarcarea unei functii (Function Overloading) sau al unui operator (Operator Overloading). |
- | **Overloading (supraincarcarea)** = posibilitatea dea avea intr-o clasa mai multe metode cu acelasi nume, acestea fiind diferentiate prin semnatura | + | **Overloading (supraincarcarea)** = posibilitatea de a avea intr-o clasa mai multe metode cu acelasi nume, fiind diferentiate prin **semnatura**. |
Extra: Supraincarcarea are loc la compilare => Compile Time | Extra: Supraincarcarea are loc la compilare => Compile Time | ||
Line 31: | Line 29: | ||
Observatie: | Observatie: | ||
* Se pot suprascrie doar metodele vizibile pe lantul de mostenire (public, protected) | * Se pot suprascrie doar metodele vizibile pe lantul de mostenire (public, protected) | ||
- | * O metoda din clasa copil poate suprascrie o metoda din clasa parinte daca au aceeasi semnatura si acelasi tip de return | + | * O metoda din clasa copil poate suprascrie o metoda din clasa parinte daca au aceeasi semnatura si acelasi tip de return. |
- | * | + | |
Extra: Suprascrierea are loc la executare => Run time | Extra: Suprascrierea are loc la executare => Run time | ||
- | (Exemplu in cadrul Laboratorului 6 cand invatam despre Derivare) | + | (Exemplu in cadrul Laboratorului 7 cand invatam despre Functii Virtuale) |
</note> | </note> | ||
- | ==== Exemplu ==== | + | <note important> Semnatura unei metode consta in: |
+ | * numele metodei | ||
+ | * numarul si tipul parametrilor | ||
+ | </note> | ||
+ | ==== 1.1. Exemplu ==== | ||
<code c++ CompileTime.cpp> | <code c++ CompileTime.cpp> | ||
#include <iostream> | #include <iostream> | ||
Line 43: | Line 45: | ||
class OOP { | class OOP { | ||
public: | public: | ||
- | void fct (int x) { //Avem un parametru de tip int | + | void fct (int x) { //Avem un parametru de tip int |
- | cout << "x = " << x << endl; | + | cout << "x = " << x << endl; |
- | } | + | } |
- | void fct (float x) { //Avem un parametru de tip float | + | void fct (float x) { //Avem un parametru de tip float |
- | cout << "x = " << x << endl; | + | cout << "x = " << x << endl; |
- | } | + | } |
- | void fct (int x, int y) { //Avem doi parametri | + | void fct (int x, int y) { //Avem doi parametri |
- | cout << "x + y = " << x + y << endl; | + | cout << "x + y = " << x + y << endl; |
- | } | + | } |
}; | }; | ||
Line 66: | Line 68: | ||
<note>Observam ca, desi au acelasi nume, **semnatura** metodelor difera doar prin **tipul** si **numarul** parametrilor.</note> | <note>Observam ca, desi au acelasi nume, **semnatura** metodelor difera doar prin **tipul** si **numarul** parametrilor.</note> | ||
- | ===== Agregare ===== | + | ===== 2. Agregare ===== |
<note important>**Agregarea** = procedeul prin care se creeaza un nou tip de date (o noua clasa) folosind tipuri de date (clase) existente | <note important>**Agregarea** = procedeul prin care se creeaza un nou tip de date (o noua clasa) folosind tipuri de date (clase) existente | ||
**Relatia de agregare** = o relatie intre clase de tipul "has a", "has many"</note> | **Relatia de agregare** = o relatie intre clase de tipul "has a", "has many"</note> | ||
- | ==== De ce? ==== | + | ==== 2.1. De ce? ==== |
<note tip>**Reutilizarea codului duplicat in dezvoltarea de aplicatii** (code reuse) | <note tip>**Reutilizarea codului duplicat in dezvoltarea de aplicatii** (code reuse) | ||
Line 78: | Line 80: | ||
</note> | </note> | ||
- | ==== Scurt exemplu ==== | + | ==== 2.2. Scurt exemplu ==== |
<code c++> | <code c++> | ||
Line 98: | Line 100: | ||
* se reutilizeaza codul deja implementat din A | * se reutilizeaza codul deja implementat din A | ||
</note> | </note> | ||
- | ==== Exemplu amanuntit ==== | + | ==== 2.3. Exemplu amanuntit ==== |
<code c++> | <code c++> | ||
#include <iostream> | #include <iostream> | ||
Line 145: | Line 147: | ||
* operatorul **=** (generat default) al lui B, il apeleaza pe cel al tipului de date A | * operatorul **=** (generat default) al lui B, il apeleaza pe cel al tipului de date A | ||
* destructorul clasei B apeleaza automat destructorul clasei A | * destructorul clasei B apeleaza automat destructorul clasei A | ||
- | **Observatie** | + | **Extra** |
Clasa B putea sa aiba mai multe atribute de tip A, dar si alte atribute de alte tipuri precum alta_Clasa obiect, A2 obiect2 etc. | Clasa B putea sa aiba mai multe atribute de tip A, dar si alte atribute de alte tipuri precum alta_Clasa obiect, A2 obiect2 etc. | ||
Line 158: | Line 160: | ||
* la **definirea** obiectului (inaintea constructorului folosind o valoare initiala sau blocuri de initializare) | * la **definirea** obiectului (inaintea constructorului folosind o valoare initiala sau blocuri de initializare) | ||
* **in cadrul constructorului** | * **in cadrul constructorului** | ||
- | * **inainte de folosire (lazy initialization)** (ca in exemplul anterior, am facut alocarea te spatiu pentru Pagina din vectorul de pagini, dar nu am dat valori atributelor din Pagina) | + | * **inainte de folosire (lazy initialization)** (Exemplu in Cursul 6, pag 37/47, observam ca s-a facut alocarea de spatiu pentru Pagina din vectorul de pagini, dar nu s-au dat valori pentru atributele din Pagina) |
</note> | </note> |