Curs 24 03 - Curs 3 - Polimorfism, Interfețe

Summary

Acesta este un curs despre polimorfism, interfețe, clase interioare, clase abstracte și moștenire, în programarea orientată pe obiecte. Cursul detaliază teme precum upcasting/downcasting, legarea dinamică, clase abstracte și interfețe.

Full Transcript

Curs 3: Polimorfism, interfețe, clase interioare Clase abstracte. Moștenirea interfețelor. Clase interioare 1. Polimorfismul și identificarea dinamică a datelor Upcasting/downcasting : conexiuni între obiectele din superclasă și cele Object...

Curs 3: Polimorfism, interfețe, clase interioare Clase abstracte. Moștenirea interfețelor. Clase interioare 1. Polimorfismul și identificarea dinamică a datelor Upcasting/downcasting : conexiuni între obiectele din superclasă și cele Object down-casting din subclasele de pe diferite nivele ierarhice. upcasting unul și același obiect putea fi tratat conform A B propriului tip sau conform tipului de bază. clase diferite derivate din aceeași rădăcină pot fi aduse la același numitor comun. C D E Polimorfism: rezolvă problema opusă – cea a diferențierii, a particularizării, a decuplării tipurilor de date. conexiuni dinamice (dynamic binding) o mai bună organizare a codului concomitent cu o creștere a gradului de extensibilitate a programelor. Curs 3 2 1. “Upcasting” versus legare dinamica Curs 3 3 1. Legarea dinamică la apelul unei metode (dynamic binding) Prin legare (binding) se înțelege conexiunea ce se stabilește între un apel de metodă și o implementare particulară a acesteia. Atunci când legarea este efectuată într-una din fazele premergătoare rulării (compilare, linkeditare) ea se numește prematură; – toate limbajele procedurale (inclusiv C) au acest tip de legare. În cazul programării OOP, dacă argumentul unei metode este o referință la superclasă, legarea dinaintea rulării creează probleme datorită confuziei compilatorului în realizarea corectă a conexiunii: apel-corp metodă. Rezolvarea acestei probleme este realizată printr-un mecanism implementat la nivelul limbajului, ce permite legarea dinamică în faza de execuție (tardivă, late binding). Acesta are la bază anumite informații existente în obiecte.. Curs 3 4 1. Legarea dinamică la apelul unei metode (dynamic binding) JAVA implementează legarea dinamică pentru toate metodele cu excepția celor declarate final. Pentru a exemplifica legarea dinamică, se va considera următoarea structură de moștenire: Curs 3 5 1. Legarea dinamică la apelul unei metode (dynamic binding) Fenomenul de upcasting poate apărea şi într-o atribuire simplă, de forma: Referința sin1 este atribuită, imediat după crearea obiectului de tip Sinusoidal, clasei Semnal. Nu va fi semnalată nici un fel de eroare, Sinusoidal fiind un subtip al clasei Semnal. La apelul metodei vizualizare( ) (redefinită în subclase): sin1.vizualizare, legătura dinamică permite conectarea la metoda din clasa Sinusoidal și nu la cea din clasa de bază. Curs 3 6 1. Legarea dinamică la apelul unei metode (dynamic binding) Output: Curs 3 7 1. Legarea dinamică la apelul unei metode (dynamic binding) Observație: dacă procesul de redefinire a unei metode în fiecare subclasă (același nume și exact aceleași argumente, dar cu corp diferit) este înlocuit (uneori accidental) printr-un proces de supraîncărcare a metodelor (același nume dar argumente diferite ca tip și/sau număr), compilatorul nu va semnala nici o eroare, dar rezultatul rulării este diferit de cel așteptat: class Nota{.....} class Media{public int calcul(int Nota){...}...} class Borderou extends Media{...public int calcul (Nota n){...}...} între întregul Nota și clasa Nota nu există nici un fel de conflict de nume; este corect și un apel de forma (Nota Nota) Curs 3 8 2. Clase şi metode abstracte O metodă se numeşte abstractă dacă este doar declarată şi nu definită. Declarația va conține, obligatoriu, cuvântul cheie abstract O clasă ce conține măcar o metodă abstractă devine clasă abstractă și va trebui calificată ca atare (în caz contrar se produce o eroare de compilare). Fiind o clasă incompletă, tentativa de a crea un obiect de tip abstract, se soldează cu eroare. Subclasele unui tip abstract pot fi instanțiale doar dacă definesc toate metodele abstracte; în caz contrar și ele sunt abstracte (trebuie calificate ca atare). O clasă poate fi declarată abstractă, chiar dacă nu conține metode abstracte; acest lucru se impune atunci când nu se dorește crearea de Curs 3 obiecte ale respectivei clase. 9 2. Clase şi metode abstracte Curs 3 10 3. Interfețe Acoperă noţiunea de clasă abstractă pură. În această situaţie definiţia tipului este precedată de cuvântul cheie interface, ce va înlocui cuvântul cheie class. Prin interfaţă se pune la dispoziţie o formă şi nu o implementare. Conţine: – Membri de tip primitiv (implicit statici şi finali); – Declaratii de metode De regulă, o interfaţă este de tip friendly; ei i se poate ataşa nivelul de acces public doar dacă are acelaşi nume cu cel al fişierului în care este definită. Subclasele sunt definite cu ajutorul construcției: Subclasa implements interfața Curs 3 11 3. Interfețe Exemplul Simulare va fi modificat, pentru a ilustra modul de lucru cu interfeţele, astfel: Curs 3 12 3. Interfețe Curs 3 13 3. Interfețe – observații Fiecare metodă din interfaţă este doar o declaraţie; orice tentativă de definire provoacă o eroare în faza de compilare. Nici una dintre metodele interfeței nu este declarată public, aceasta fiind o caracteristică înțeleasă în mod implicit. Procesul de moștenire decurge la fel, indiferent de tipul superclasei (obișnuită, abstractă, interfață). Curs 3 14 4. Moştenirea multiplă în JAVA Deoarece o interfață nu conține nici un fel de implementare, ea nu implică alocare de memorie. Această caracteristică facilitează procesul de combinare a mai multor interfețe – În limbajul C++, combinarea mai multor interfețe poartă numele de moștenire multiplă. Ea se desfășoară conform unor reguli precise deoarece, în principiu, orice clasă poate avea o implementare. Se permite o relaxare a acestor reguli, deoarece doar o singură clasă poate avea o implementare. În moștenirea multiplă, setul superclaselor trebuie să cuprindă o singură clasă care să nu fie interfață; celelalte, arbitrar de multe, sunt interfețe. BB implements Interfaţa1, Interfata2,..., extends AA {...} Curs 3 15 4. Moştenirea multiplă în JAVA Output: Curs 3 16 5. Clase interioare O clasă definită în interiorul altei clase, metode, domeniu se numește clasă interioară. Conceptul permite gruparea claselor și controlul accesului în profunzimea acestora Conceptul de clasă interioară este, însă, diferit de cel de compunere. Instanțierea poate fi realizată: – ca pentru oricare altă clasă obișnuită, – pot să existe metode în clasa exterioară care să returneze o referință către un obiect al clasei interioare, Curs 3 17 5. Clase interioare Curs 3 18 5. Clase interioare Dacă instanțierea unei clase interioare este realizată în clasa exterioară (oriunde, cu excepția interiorului unei metode nestatice), se va folosi sintaxa: NumeClasaExterioara.NumeClasaInterioara numeObiect Adevărata putere a unei clase interioare apare însă în procesul de upcasting către o superclasă ce poate fi, în particular, o interfață. Ea permite ascunderea implementării, nefiind vizibilă și accesibilă. Singura componentă accesibilă este referință către superclasă. Curs 3 19 5. Clase interioare Curs 3 20 5. Clase interioare în metode și în domenii Crearea claselor interioare poate fi realizată nu numai în contextul unei simple imbricări de clase. Curs 3 21 5. Clase interioare în metode și în domenii O clasă poate fi declarată și în interiorul unui domeniu oarecare Deși clasa B este creată în interiorul unui if, aceasta nu înseamnă că ea este creată condiționat; ea este compilată împreună cu toate clasele create. Astfel că ea are toate proprietățile unei clase obișnuite, cu excepția faptului că nu este disponibilă decât interiorul construcției if Curs 3 22 6. Legătura cu clasa exterioară Obiectele corespunzătoare unei clase interioare sunt legate de obiectele clasei exterioare care, de altfel, le-au generat. Ele pot accesa orice membru al obiectului ce le cuprinde, fără a fi necesară folosirea unor calificatori suplimentari. Este posibil deoarece clasa interioară are informații despre referința obiectului (din clasa exterioară) ce a determinat instanțierea ei. – Din acest motiv crearea unui obiect din clasa interioară trebuie asociată întotdeauna unui obiect din clasa exterioară. Curs 3 23 6. Legătura cu clasa exterioară Păstrarea referinței obiectului din clasa exterioară nu mai este adevărată pentru clasele interioare declarate static. Pentru acestea: – nu este necesar un obiect din clasa exterioară pentru a crea un obiect al clasei interioare (de tip static); – nu poate fi accesat nici un obiect al clasei exterioare dintr-un obiect al clasei interioare; – nu pot exista date sau clase interioare declarate de tip static. Dacă metodele claselor interioare au nevoie de referința obiectului din clasa exterioară se va folosi construcția NumeClasaExterioară.this Curs 3 24 6. Legătura cu clasa exterioară Procesul de moștenire dintr-o clasă interioară este destul de complicat, deoarece constructorul acesteia trebuie să se atașeze referinței obiectului aferent din clasa exterioară. Problema apare atunci când referința către obiectul din clasa exterioară trebuie inițializată fără a exista, încă, în subclasă, un obiect de care să se atașeze. Soluția presupune realizarea unei asocieri explicite, ca în următorul exemplu: Curs 3 25 6. Legătura cu clasa exterioară Curs 3 26 Sumar curs Polimorfism – Upcasting versus polimorfism – Legarea dinamica Clase abstracte Interfețe Moștenirea multipla Clase interioare Curs 3 27

Use Quizgecko on...
Browser
Browser