Sunteți pe pagina 1din 27

PROGRAMARE ORIENTATĂ

OBIECT
Limbajul şi platforma Java
Programare II. C3
Motto

“Everything should be made as simple


as possible, but not simpler…”
Albert Einstein

2
Capitolul 3
POLIMORFISM şi GENERICITATE
Principii OO: Polimorfism și Genericitate
Agenda: Principii OO și programare funcțională

❏ 1. Polimorfismul obiectelor
❏ Interfețe și egalitatea obiectelor
❏ Forme polimorfice cu structuri obiectuale
❏ 2. Genericitate
❏ Parametrizarea tipurilor
❏ Comparabilitatea obiectelor

4
1. Polimorfism (en. polymorphism)
● Poli-morfism-ul desemnează manifestări/forme/semnificaţii
diferite pornind de la acelaşi nume (sau simbol):
○ acelaşi nume de operaţie cu mai multe implementări;
○ acelaşi nume de variabilă (aceeași variabilă) prin care se
accesează referinţe către obiecte (din clase) diferite;
○ acelaşi nume de variabilă prin care sunt invocate operaţii
cu acelaşi nume către obiecte din clase diferite.
● Polimorfismul reprezintă o formă de genericitate.
○ Prin genericitate se poate înțelege declararea(inducția)
unei forme generalizabile și utilizarea concretă a unor
forme specifice(deducția).
○ Baza manifestărilor polimorfice provine din supra-
încărcare, dar mai ales din supra-scriere.

5
Forme de polimorfism
● Polimorfismul unei operaţii – se referă la (acoperă)
setul de clase în definiţia cărora este definită
respectiva operaţie.
● Polimorfismul unei variabile – se referă la (acoperă)
setul de clase ale căror instanţe pot fi
manevrate/referenţiate prin intermediul aceleiași
variabile, ca urmare a inferenţei tipului asociat
variabilei.
● Polimorfismul mesajelor (sau adresabilităţii) – se
referă la (acoperă) combinarea domeniilor celor două
forme de polimorfism anterior.

6
Interfețe și polimorfism

● Interfaţa reprezintă un mecanism de separare a


definiţiei tipului faţă de implementare.
● Interfețele pot fi implicate polimorfic în următoarele
moduri:
○ (1) Pentru abstractizarea tipurilor de date (TAD).
■ Declararea unui set de proprietăți (get/set)
reprezentate concret în mai multe forme (clase de
implementare).
○ (2) Pentru abstractizarea comportamentelor (serviciilor)
■ Comportamentele pot fi abstractizate prin operații
specifice (la nivelul interfețelor)
■ și pot fi operaționalizate algoritmic prin strategii
alternative în cadrul claselor concrete.

7
Exemplu Polimorfism :: org.polimorfism
● Model: moștenire “multiplă” cu interfețe
○ Interfețe:
■ ICerinteTeamService
■ ITasksTeamService
○ Clasa de implementare
■ CerinteTeamServiceImpl_Strategia1
● Test funcțional TestPolimorfismInterfete: Strategii
implementare serviciu ICerinteTeamService
○ polimorfism operatie -
■ getCerinteResponsabil(Membru membru,
List<Cerinta> cerinte)
○ Ierarhie implementare
■ CerinteTeamServiceImpl_Strategia1
■ CerinteTeamServiceImpl_Strategia2
* 8
Exemplu(2) Polimorfism :: org.polimorfism
● Model:
○ Ierarhie Membru: polimorfism operație -
● suprascriere: setCompetente() în Membru,
LiderEchipa;
● supraîncarcare: setCompetente() în
LiderEchipa;
○ Ierarhie Cerinta: polimorfism operație -
● suprascriere: setCategorie()
● TestPolimorfismEquals
○ polimorfism variabilă -
■ var membru și responsabil în clasa Test;
○ polimorfism mesaj (apel) -
■ var membru apel setCompetente();

* 9
Egalitate între obiecte:
Egalitate între instanţe ale clasei Object
● Operatorul == verifică de fapt “conţinutul” concret al
variabilelor care stochează referinţe, adică verifică referinţele
stocate ca valori ale variabilelor.
● Verificarea echivalenței obiectelor (la care se face referire
prin variabile) în sensul “identităţii” presupune verificarea
stării interne a acestora, sau, cel puţin, a atributelor care pot
diferenţia obiectele între ele.
● În Java – în vârful tuturor ierahiilor de moştenire se găseşte
clasa Object de la care toate clasele vor moşteni metoda
equals(Object) ce va putea fi supra-scrisă în sensul codificării
identităţii drept principiu de egalitate.

* 10
* 11
Exemplu(3) Polymorphism :: org.app.scrum
● Ierarhie Membru - ManagerProiect
○ equals() - criterii:
■ id și rol;
● TestPolimorfismEquals

* 12
2. Genericitate: Java GENERICS
Polimorfism prin parametrizarea tipurilor
● Clasele și metodele Java generice permit:
○ specificarea unui set de comportamente asociate, prin
declarația unei singure metode;
○ specificarea unui set de tipuri asociate, prin declarația unei
singure clase.
● Studiu de caz genericitate:
○ declararea unei metode de sortare a unui tablou de obiecte;
○ folosirea aceleași metode pentru sortarea:
■ unui tablou de valori/instanțe String;
■ unui tablou de valori/instanțe Integer;
■ unui tablou de valori/instanțe java.util.Date etc.;

13
Metodelor generice

● Genericitatea a introdus o facilitate numită variabilă-tip sau


parametru-tip ca o declarație în definiția claselor sau
interfețelor, cu o sintaxă de genul <T>.
● Declarația unei metode generice poate specifica
parametri-tipuri pentru:
○ tipul returnat;
○ tipul argumentelor (de intrare/apel);
● Exemple:
○ public <E> void afisareSerie(E[ ] tablouSerie) { };
○ public <E> E[ ] sortareSerie(E[ ] tablouSerie) { };
○ public <E> E maxElementSerie(E[ ] tablouSerie) { };
○ public <E> E nextElementSerie(E[ ] tablouSerie, E element) { };

14
Exemplu Generics :: org.generics.defs
● Class: ManipulareSerieGenerica
● TestGenericsManipulareTablou

* 15
Clase generice

● Declarația unei clase generice poate specifica


parametri-tipuri pentru:
○ tipul membrilor-atribute;
○ tipul returnat al oricărui membru-metodă;
○ tipul argumentelor (de intrare/apel) oricărui membru-metodă
(inclusiv constructori).
● Exemple:
○ public class SerieNumerica<E>{
■ private E[] tablouSerie;
■ public SerieNumerica(E[] t){this.tablouSerie = t;}
■ public E[] sortareSerie() { };
■ public E nextElementSerie(E element) { };
○ }
16
Restricționare definire tipuri generice
<E extends Type> : Upper Bounded Type
● Implicit, tipurile parametrilor generici fac referire la tipul
Object.
● Pentru o definire mai specifică a tipului parametrilor
generici (o restricționare a tipului: upper bounded type)
○ se poate folosi cuvântul-cheie extends
<E extends Type> E operatie(E arg){...};
<E extends Number> E[] sortareSerie(E[] tablou){...};
class SerieNumerica<E extends Number>{...}
○ se poate folosi cuvântul-cheie implements
<E implements IType> E operatie(E arg){...};
<E implements Comparable> E[] sortareSerie(E[] tablou){...};
class SerieNumerica<E implements Comparable>{...}

17
Inițializare/Utilizare tipuri generice

● Declarare și instanțiere obiecte din tipuri generice:


SerieNumerica<Integer> serieNumere = new
SerieNumerica<>(new Integer[]{50, 75, 25});
● Subclasare tipuri generice
public class SubSerieIntregi extends SerieNumerica<Integer>{}
SubSerieIntregi serieNumere = new
SubSerieIntregi(new Integer[]{50, 75, 25});
● Folosirea sintaxei cu <?> wildcard
SerieNumerica<?> serieNumere;
serieNumere = new SerieNumerica<Integer>(new Integer[]{50,
75, 25});
serieNumere = new SerieNumerica<Double>(new Integer[]{50.0,
75.0, 25.0});
18
Restricționare tipul generic necunoscut
Wildcard-ul <?>: “Covariance” și Polimorfism
● SerieNumerica<Integer> s1;
○ Polimorfism ?
■ s1 = new SerieNumerica<Double>(); // Eroare Compilare
● SerieNumerica<Number> s2;
○ Polimorfism - greșit: invarianță
■ s2 = new SerieNumerica<Integer>(); // Eroare Compilare
■ s2 = new SerieNumerica<Double>(); //Eroare Compilare
● SerieNumerica<? extends Number> s3;
○ Polimorfism - corect: covarianță (upper-bounded wildcard)
■ s3 = new SerieNumerica<Integer>(); //ok:polimorfism variabila
■ s3 = new SerieNumerica<Double>(); //ok:polimorfism variabila
● SerieNumerica<? super Integer> s4;
○ Polimorfism - corect: contravarianță (lower-bounded wildcard)
■ s4 = new SerieNumerica<Number>(); //ok:polimorfism

19
Exemplu: GenericsAndLambdas ::
org.numeric.generics
● Class: SerieNumericaBounded<E extends Number>
● TestGenericsManipulareTablou

* 20
Colecțiile Java netipizate

● Declarare colecții netipizate


○ List strings = new ArrayList();
● Alimentare și extragere din colecții netipizate
○ strings.add(“sir”);
○ String sir = (String)strings.get(0);
○ strings.add(“sir”); // ok, dar colectii neomogene
● Parcurgere colecții netipizate
○ Cu iterator netipizat și structură while
■ Iterator i = strings.iterator();
■ while(i.hasNext()){
● String sir = (String)i.next();}
○ Cu structură for netipizată
■ String sir;
■ for(Object element: strings){
● sir = (String)element; }
21
Aplicare genericitate în
Colecțiile Java tipizate
● Declarare colecții tipizate
○ List<String> strings = new ArrayList<String>();
● Alimentare și extragere din colecții
○ strings.add(“sir”);
○ String sir = strings.get(0);
○ strings.add(20); // eroare compilare
● Parcurgere colecții
○ Cu iterator tipizat și structură while
■ Iterator<String> i = strings.iterator();
■ while(i.hasNext()){String sir = i.next();}
○ Cu structură for tipizată
■ for(String sir: strings){...}

22
Interfaţe generice: Comparable<T>

● Clasele care implementează această interfaţă vor


defini o metodă prin care pot fi comparate și
ordonate instanţele acestora.
● Caracteristici:
○ int compareTo(T object)
■ return negativ – “mai mic”;
■ return 0 – “egal”;
● echivalență semantică cu equals(Object);
■ return pozitiv – “mai mare”.

* 23
Interfaţe generice: Comparator<T>

● Clasele care implementează Comparator<T>


furnizează un serviciu de comparare/ordonare
pentru instanţele altor clase.
● Caracteristici:
○ int compare(T obj1, T obj2);
■ echivalență semantică cu obj1.compareTo(obj2).

* 24
Exemplu interfețe generice Generics ::
org.generics.interfaces
● Model Ierarhie Membru
○ Comparable<T> - criterii:
■ numePrenume;
● TestComparable

* 25
Referințe și tutoriale on-line

● Generics
○ http://tutorials.jenkov.com/java-generics/index.html
○ http://www.javacodegeeks.com/2011/04/java-generics-quick-tutorial.html
○ https://howtodoinjava.com/core-java/generics/complete-java-generics-tutorial/
○ https://dzone.com/articles/how-do-generic-subtypes-work

● Lambdas. Functional Interfaces


○ https://dev.java/learn/lambda-expressions/
○ https://www.oreilly.com/learning/java-8-functional-interfaces
○ https://www.javatpoint.com/java-8-functional-interfaces
○ https://www.tutorialspoint.com/java8/java8_lambda_expressions.htm
○ https://www.javatpoint.com/java-lambda-expressions
○ http://tutorials.jenkov.com/java/lambda-expressions.html
○ https://www.journaldev.com/16703/java-lambda-expression
○ https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

26
Referințe și tutoriale on-line

● Methods References
○ https://www.tutorialspoint.com/java8/java8_method_references.
htm
○ https://www.javatpoint.com/java-8-method-reference
● Optionals
○ https://www.baeldung.com/java-optional
○ https://www.oracle.com/technetwork/articles/java/java8-optional
-2175753.html
○ https://www.journaldev.com/16709/java-optional
○ https://examples.javacodegeeks.com/core-java/util/optional/java-
8-optional-example/

27

S-ar putea să vă placă și