programare orientata pe obiect
Post on 10-Mar-2016
219 Views
Preview:
DESCRIPTION
TRANSCRIPT
7/21/2019 Programare orientata pe obiect
http://slidepdf.com/reader/full/programare-orientata-pe-obiect 1/8
1 Genericitate
1.1 Introducere
Am prezentat in laboratorul anterior principalele avantaje ale utilizarii meca-nismului de abstractizare a tipurilor de date in limbajul Java. In cadrul acestuilaborator, vom analiza in detaliu acest mecanism. Tipurile generice simplificalucrul cu colectii, permitand tipizarea elementelor acestora. Definirea unui tipgeneric se realizeaza prin specificarea intre paranteze unghiulare a unui tip dedate Java, efectul fiind impunerea tipului respectiv pentru toate elementelecolectiei.
IMPORTANT !
In cazul folosirii tipurilor generice, incercarea de a utiliza in cadrul uneicolectii a unui element necorespunzator ca tip va produce o eroare la com-pilare, spre deosebire de varianta in care tipurile generice nu sunt uzitate,ce permite doar aruncarea unor exceptii de tipul ClassCastException ,in cazul folosirii incorecte a tipurilor.
1.2 Definirea structurilor generice
Pentru o intelegere mai buna a conceptului de structura generica, pornim de laclasa definita mai jos.
Cod sursa Java
1 c l a s s As s o c ia tio n <K , V> {2 p r i v a t e K key ;3 p r i v a t e V v a l u e ;4
5 p u b l i c A s s o c i a t i o n (K k ey , V v a l u e ) {6 t h i s . ke y = ke y ;7 t h i s . v a l u e = v a l u e ;8 }9
10 p u b l i c K g e tK e y ( ) {11 r e tu r n t h i s . key ;12 }13
14 p u b l i c V g e t Va l u e ( ) {15 r e tu r n t h i s . valu e ;16 }17 }
1
7/21/2019 Programare orientata pe obiect
http://slidepdf.com/reader/full/programare-orientata-pe-obiect 2/8
Sintaxa <K, V> este folosita pentru a defini tipuri formale in cadrul definitieiclasei. Aceste tipuri pot fi folosite in mod asemanator cu tipurile uzuale. In
momentul in care invocam efectiv o structura generica, ele vor fi inlocuite cutipurile efective, utilizate in invocare. Astfel, pentru a instantia obiecte detipul Assocition, folosim apeluri de forma:
Cod sursa Java
1 c l a s s T e st {2 p ub li c s t a t i c v oi d m ai n ( S t r i n g a r g s [ ] ) {3 A s s o c i a t i o n < S t r i n g , S t r i n g > map1 ;4 map1 = new A s s o c i a t i o n < S t r i n g , S t r i n g >("CC" , "POO" ) ;5 S tr in g s 1 = map1. ge tK ey () ;6 A s s o c i a t i o n < S t r i n g , I n t e g e r > map2 ;7 map2 = new A s s o c i a t i o n < S t r i n g , I n t e g e r >("POO" , 2 0 1 5 ) ;8 S tr in g s 2 = map2. ge tK ey () ;
9 i n t n r = map2. ge tValu e () ;10 }11 }
Se poate observa ca, in aceste exemple, tipurile formale, K si V , au fostinlocuite cu tipuri efective (String , Integer ). De asemenea, de remarcat estesi faptul ca ambele metode de tip get , din implementarea clasei analizate, auca rezultat un obiect cu tip formal, iar in cadrul apelului nu a fost nevoie deoperatii de tip cast .
Observatie
O analogie (simplista) referitoare la acest mecanism de lucru cu tipurilese poate face cu mecanismul functiilor: acestea se definesc utilizandparametri formali, urmand ca, in momentul unui apel, acesti parametriisa fie inlocuiti cu parametri actuali.
1.2.1 Genericitatea in subtipuri
Consideram, spre analiza, urmatoarea situatie, descrisa prin codul de mai jos.Aceasta situatie contine doua operatii, iar despre prima stim cu siguranta caeste una valida, fiind explicata anterior. Ne intereseaza daca a doua operatie
este posibila si o explicatie a raspunsului la aceasta intrebare.
2
7/21/2019 Programare orientata pe obiect
http://slidepdf.com/reader/full/programare-orientata-pe-obiect 3/8
Cod sursa Java
1 c l a s s T e st {2 p ub li c s t a t i c v oi d m ai n ( S t r i n g a r g s [ ] ) {3 A s s o c i a t i o n < S t r i n g , I n t e g e r > map1 ;4 / / O p e ra t i a 15 map1 = new A s s o c i a t i o n < S t r i n g , I n t e g e r >("POO" , 2 0 1 5 ) ;6 As s o c ia tio n < O b je c t , O b je c t> map2;7 / / O p e ra t i a 28 map2 = map1;9 }10 }
Presupunand, prin absurd, ca operatia 2 este una corecta, am putea introducein map2 orice fel de obiecte, fapt ce ar conduce la potentiale erori de executie.Din acest motiv, operatia 2 nu va fi permisa de catre compilator!
IMPORTANT !
Generalizand, daca CType este un subtip (clasa descendenta sau subin-terfata) al lui PType, atunci o structura generica GenericStruc-
ture<CType> NU este un subtip al lui GenericStructure<PType>.Atentie la acest concept, intrucat el nu este intuitiv!
1.2.2 Restrictionarea parametrilor
Exista cazuri in care dorim sa adaugam intr-o structura de date generica elementecare au un tip cu anumite proprietati. De cele mai multe ori, acest lucru seintampla in cazul structurilor generice care contin elemente cu tipuri derivate.Spre exemplu, sa spunem ca dorim sa realizam o clasa AVector care extindeclasa AbstractList si vrem ca elementele din structura sa fie subtipuri ale luiNumber .
Cod sursa Java
1 ab s t ra c t c l a s s AVector<E e x t e n d s Number> e x t e n d s2 Ab s t r ac t Lis t <E> {3 a b s t r a c t p u b l i c b o ol e an add (E ob j ) ;4 a b s t r a c t p u b l i c E g e t ( i n t inde x ) ;
5 a b s t r a c t p u b l i c Enumeration<E> el em en ts () ;6 a b s t r a c t p u b l i c I t e r a t o r <E> i t e r a t o r ( ) ;7 a b s t r a c t p u b l i c L i s t I t e r a t o r <E> l i s t I t e r a t o r ( ) ;8 }
3
7/21/2019 Programare orientata pe obiect
http://slidepdf.com/reader/full/programare-orientata-pe-obiect 4/8
Sintaxa <E extends Number> indica faptul ca tipul E este o subclasa a lui
Number (sau chiar Number ). Aceasta restrictie face imposibila instantierea
unui obiect, avand un tip derivat din AVector , care sa contina elemente de tipString , deoarece String nu este o subclasa a lui Number .
Fie clasa Vector o clasa instantiabila care extinde AVector . Dupa ce amrealizat instantierea unui obiect Vector , precizand ca tip pentru elementeleacestui Integer , nu mai putem adauga in aceste elemente de tip Double, spreexemplu, chiar daca, la o prima vedere, acest lucru ar fi posibil, deoarece Double
reprezinta un subtip al lui Number . Pentru o intelegere mai buna a celor expuse,este recomandata analizarea exemplului de cod propus mai jos.
Cuvantul cheie extends este folosit si in cazul in care dorim sa indicam un tipce implementeaza o anumita interfata. Un exemplu in acest sens poate fi clasadefinita in blocul de cod urmator.
Cod sursa Java
1 c l a s s Map<K e x t e n d s Number, V e x t e n d s S et<K>>2 e x t e n d s A s s oc iat ion <K , V> {3 p u b l i c M ap (K ke y , V valu e ) {4 s u p e r ( k ey , v a l u e ) ;5 }6
7 p ub li c s t a t i c v oi d m ai n ( S t r i n g a r g s [ ] ) {8 Map<Double , Tree Set <Double>> ob j ;9 TreeSet<Double> v = new TreeSet<Double>() ;10 v . add ( new D ou ble (2 .5 ) ) ;11 o b j = new Map<Double , TreeSet<Double> >(1.2, v) ;12 D ou ble x = ob j . ge tKe y () ;13 S yste m . ou t . p r in tl n (x ) ;
14 Tr e e S e t<D oub le> s e t = ob j . ge tValu e () ;15 System . out . pr in tl n ( se t ) ;16 }17 }
1.3 Wildcards
Wildcard-urile sunt utilizate atunci cand dorim sa intrebuintam o structuragenerica drept parametru intr-o functie si nu dorim sa limitam tipul de date dincolectia respectiva. De exemplu, o situatie precum urmatoarea ne-ar restrictionasa folosim la apelul functiei doar o colectie cu elemente de tip Object (ceea ceNU poate fi convertita la o colectie de un alt tip, dupa cum am vazut mai sus):
4
7/21/2019 Programare orientata pe obiect
http://slidepdf.com/reader/full/programare-orientata-pe-obiect 5/8
Cod sursa Java
1 v o id b o o l ea n c o n t a i n s A l l ( C o l l e c t i o n <O bj ec t > c ) {2 f o r ( Ob je ct e : c ) {3 i f ( ! t h i s . c o n t a i n s ( e ) ) {4 r et ur n f a l s e ;5 }6 }7 r e t u r n t r u e ;8 }
Aceasta restrictie este eliminata de folosirea wildcard-urilor, dupa cum sepoate vedea in blocul de cod de mai jos.
Cod sursa Java
1 v o id b o o l ea n c o n t a i n s A l l ( C o l l e c t i o n <?> c ) {2 f o r ( Ob je ct e : c ) {3 i f ( ! t h i s . c o n t a i n s ( e ) ) {4 r et ur n f a l s e ;5 }6 }7 r e t u r n t r u e ;8 }
IMPORTANT !
O limitare care intervine insa este ca nu putem adauga elemente arbitrareintr-o colectie cu wildcard-uri.
Cod sursa Java
1 c l a s s T e s t C l a ss {2 p ub li c s t a t i c v oi d m ai n ( S t r i n g a r g s [ ] ) {3 / / O p e r a ti e p e r mi s a4 C o l l e c t i o n <?> c = new Lin ke d L is t< I n te ge r >() ;5 / / Er o ar e l a c o m pi l a re6 c . add ( new Object () ) ;7 }8 }
5
7/21/2019 Programare orientata pe obiect
http://slidepdf.com/reader/full/programare-orientata-pe-obiect 6/8
Observatie
Eroarea apare deoarece nu putem adauga intr-o colectie generica decatelemente de un anumit tip, iar wildcard-ul nu indica un tip anume.
Aceasta inseamna ca nu putem adauga nici macar elemente de tip String .Singurul element care poate fi adaugat este insa null , intrucat acesta estemembru al oricarui tip referinta. Pe de alta parte, operatiile de tip getter
sunt posibile, intrucat rezultatul acestora poate fi mereu interpretat dreptObject .
Cod sursa Java
1 c l a s s T e s t C l a ss {2 p ub li c s t a t i c v oi d m ai n ( S t r i n g a r g s [ ] ) {
3 S e t<?> s e t = new HashSet<Integ er >() ;4 (( Has hS e t< I n te ge r >) s e t ) . add ( 10) ;5 O b j e c t i t e m = s e t . i t e r a t o r ( ) . h a sN e xt ( ) ;6 Lis t <?> l i s t = new Lin ke d Li s t< S tr in g > () ;7 (( Lin ke d L is t< S tr in g > ) l i s t ) . add ( "POO" ) ;8 ite m = l i s t . ge t (0) ;9 }10 }
1.4 Bounded Wildcards
In anumite situatii, faptul ca un wildcard poate fi inlocuit cu orice tip sepoate dovedi un inconvenient. Mecanismul bazat pe Bounded Wildcards
permite introducerea unor restrictii asupra tipurilor ce pot inlocui un wildcard,obligandu-le sa se afle intr-o relatie ierarhica fata de un tip fix specificat.
Sintaxa Set<? extends Number> impune ca tipul elementelor multimii sa fieNumber sau o subclasa a acesteia. Astfel, in exemplul de mai jos, obiectul set
ar fi putut avea, la fel de bine, tipul HashSet<Short> sau TreeSet<Long>.In mod similar, putem imprima constrangerea ca tipul elementelor multimii safie AbstractMethodError sau o superclasa a acesteia, utilizand sintaxa Set<?
super AbstractMethodError>.
IMPORTANT !
Trebuie retinut faptul ca, in continuare, nu putem introduce valori intr-ocolectie ce foloseste bounded wildcards si este data ca parametruunei functii.
6
7/21/2019 Programare orientata pe obiect
http://slidepdf.com/reader/full/programare-orientata-pe-obiect 7/8
Cod sursa Java
1 c l a s s T e s t C l a ss {2 p ub li c s t a t i c v oi d p r in tTyp e ( S e t<? e x t e n d s Number> se t ) {3 f o r ( Number i t em : s e t ) {4 S yste m . ou t . p r in tl n ( ite m . ge t Cla s s () ) ;5 }6 }7
8 p ub li c s t a t i c v oi d m ai n ( S t r i n g a r g s [ ] ) {9 Set<Number> se t = new HashSet<Number>() ;10 se t . add( new I n t e g e r ( 5 ) ) ;11 se t . add( new D ou ble (7 .2 ) ) ;12 se t . add( new F l o a t ( 1 0 . 5 ) ) ;13 Te s tC las s . p r in tTyp e ( s e t ) ;14 }15 }
1.5 Metode generice
Java ne ofera posibilitatea scrierii de metode generice (deci avand un tip-parametru) pentru a facilita prelucrarea unor structuri generice (date ca parametru),ceea ce am vazut si in subsectiunea anterioara.
Pentru o intelegere mai buna a acestui concept, se recomanda parcurgerea celordoua metode propuse, in vederea analizarii corectitudinii lor.
Cod sursa Java
1 c l a s s T e s t C l a ss {2 //Metoda13 p u b l i c <T> v o i d m e t od a1 ( T [ ] a , C o l l e c t i o n <T> c ) {4 f o r (T o : a ) {5 / / O p e r a ti e p e r mi s a6 c . add(o ) ;7 }8 }9
10 //Metoda 211 p u b l i c v o id m et od a2 ( O b j e c t [ ] a , C o l l e c t i o n <?> c ) {12 f o r ( O bj ect o : a ) {13 / / Er o ar e l a c o m pi l a re
14 c . add(o ) ;15 }16 }17 }
7
7/21/2019 Programare orientata pe obiect
http://slidepdf.com/reader/full/programare-orientata-pe-obiect 8/8
Trebuie remarcat faptul ca metoda1 este o metoda valida, care se excuta corect,insa nu putem spune acelasi lucru si despre metoda2 , din cauza limitarii, pe
care am explicat-o deja in subsectiunea anterioara, referitoare la adaugareaelementelor intr-o colectie generica, avand un tip specificat. Este de remarcatfaptul ca, in acest caz, putem folosi wildcards, dar si bounded wildcards.Acest lucru este evidentiat in blocul de cod urmator.
Cod sursa Java
1 c l a s s T e s t C l a ss {2 Li st <Number> de st ;3
4 p u b l i c <T> v o i d copy ( Set<T> dest , Lis t <? e x t e n d s T> s r c ) {5 f o r (T o : s rc ) {6 d e s t . add ( o) ;7 }
8 }9
10 p u b l i c <T e x t e n d s Number> b o o l e a n ad d All ( Col le c tio n <T> c ){
11 f o r (T o : c ) {12 d e s t . add ( o) ;13 }14 r e t u rn t r u e ;15 }16 }
8
top related