programare orientata pe obiect

Post on 10-Mar-2016

219 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

POO

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