Sunteți pe pagina 1din 17

Lectia 6

Polimorsmul
6.1 Ce este polimorsmul?

Prin intermediul magistralei USB (Universal Serial Bus) se pot conecta la un calculator diverse dispozitive periferice precum aparate foto sau camere video digitale, toate produse de diverse rme. Magistrala care conecteaz dispozitivul periferic la un calculator a nu cunoate tipul dispozitivului periferic ci doar faptul c acesta este un dispozitiv s a periferic. Ce s-ar ampla a dac magistrala ar cunoate diferitele particulariti nt ns a s at de transfer de date ale ecrui dispozitiv? Rspunsul este simplu: loc de o functie a a n general pentru transferul datelor a ntre calculator i diverse periferice, aceasta ar trebui s s ofere mai multe functii de transfer specice pentru ecare tip de periferic parte!!! a n Ca efect, atunci cnd ar apare un nou tip de periferic, magistrala USB ar trebui modia cat astfel at s e posibil i transferul a nc a s ntre calculator i noul dispozitiv!!! Evident s acest lucru nu e convenabil. cele ce urmeaz, vom arta printr-un exemplu simplu In a a cum anume putem modela ntr-un limbaj orientat pe obiecte o magistral USB care a s poat transfera date a a ntre un calculator i un dispozitiv periferic, indiferent de tipul s concret sau de particularitile de transfer de date ale perifericului. at Dup cum am precizat anterior, o magistral USB realizeaz transferul de date dintre a a a un calculator i un dispozitiv periferic. Anterior s-a precizat c aceast magistral nu s a a a cunoate exact tipul dispozitivului periferic implicat transferul de date, ci doar faptul s n c acesta este un dispozitiv periferic. Spuneam Sectiunea 1.1.1 c simplicm sau a n a a abstractizm obiectele retinnd doar aspectele lor esentiale. Tot atunci am stabilit c a a a aspectele esentiale ale unui obiect sunt relative la punctul de vedere din care este vzut a obiectul. Concret, pentru magistrala USB este important ca dispozitivul implicat n transferul de date s contin servicii pentru stocarea i furnizarea de date. Evident, a a s pentru un utilizator al unei camere video este important ca aceasta, pe lng posibila a itatea conectrii la un calculator vederea descrcrii lmelor, s i lmeze. Avnd a n a a as a vedere aspectele esentiale din punctul de vedere al magistrlei USB, vom deni clasa n Device de mai jos ale crei instante furnizeaz servicii de stocare, respectiv furnizare a a

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

88 de date.
class Device { private String information; public Device() { information = ""; } public Device(String information) { this.information = information; } public void store(String information) { this.information = information; } public String load() { return information; } }

LECTIA 6. POLIMORFISMUL

Orice utilizator al oricrui dispozitiv periferic de genul aparat foto sau camer video a a dorete la un moment dat s descarce informatia continut de dispozitiv pe calculas a a tor. Datorit acestui fapt e absolut normal ca orice dispozitiv periferic concret s e a a modelat de o clas ce extinde clasa Device adugnd acelai timp servicii specice a a a n s respectivului dispozitiv ca exemplul de mai jos. n
class PhotoDevice extends Device { public PhotoDevice(String information) { super(information); } public void takePicture() { System.out.println("TakePicture..."); //String picture = ... //Se va apela this.store(picture) pentru stocarea pozei } }

class VideoDevice extends Device { private String producer;

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

6.1. CE ESTE POLIMORFISMUL?

89

public VideoDevice(String information, String producer) { super(information); this.producer = producer; } public void film() { System.out.println("Film..."); //String film = ... //Se va apela this.store(film) pentru stocarea filmului } }

Pentru cealalt parte implicat transferul de date, i anume calculatorul, denim a a n s clasa PC de mai jos.
class PC { private String memory = ""; private String registry; public void store(String information) { memory += information; registry = information; } public String load() { return registry; } }

ne, clasa USB ofer servicii pentru transferul de date bidirectional In a ntre un calculator i un dispozitov periferic. Codul su e prezentat mai jos. s a
class USB { public void transferPCToDevice(PC pc, Device device) { String data; data = pc.load(); device.store(data); System.out.println("PC -> Device " + data); } public void transferDeviceToPC(PC pc, Device device) { String data; data = device.load();

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

90

LECTIA 6. POLIMORFISMUL

pc.store(data); System.out.println("Device -> PC" + data); } }

Figura 6.1: Diagrama de clase pentru exemplul discutat.

Magistrala USB trebuie s poat transfera date a a ntre calculator i orice tip s de dispozitiv periferic. E posibil acest lucru avnd vedere c interfata a n a magistralei ofer doar dou servicii? Rspunsul este DA, deoarece device a a a poate referi orice obiect instant a clasei Device sau a oricrei clase ce a a motenete clasa Device!!! s s S vedem acum un exemplu de utilizare a claselor denite pn acum. Sectiunea 5.5 a a a In am vzut c putem utiliza o instant a unei subclase locul unui obiect al superclasei a a a n sale. Datorit acestui fapt, clientul de mai jos e corect. Putem observa acest client, a n c obiectul de tip USB este utilizat att pentru a transfera date de la calculator la un a a aparat foto, ct i pentru a transfera date de la calculator la o camer video. Prin a s a urmare, bazndu-ne pe motenirea de tip, am modelat o magistral ce poate trasfera a s a date ntre un calculator i orice tip concret de dispozitiv periferic. s
class ClientUSB { public static void main(String[] args) { Device photo, video; PC pc;

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

6.1. CE ESTE POLIMORFISMUL?

91

USB usb; photo = new PhotoDevice("initialPhotoData"); video = new VideoDevice("initialVideoData","company"); pc = new PC(); usb = new USB(); usb.transferPCToDevice(pc, photo); usb.transferDeviceToPC(pc, video); } }

Din pcate lucrurile nu se opresc aici. S presupunem acum c cazul camerelor a a a n video se dorete ca la descrcarea lmelor, pe lng informatia stocat de camer, s s a a a a a a se transmit i numele productorului acesteia. Prin urmare, implementarea metodei as a load din clasa Device nu e potrivit pentru camerele video i s-ar prea c magistrala a s a a noastr USB ar trebui s trateze a a ntr-un mod particular trasferul de date de la o camer a video la un calculator. Nu e deloc aa !!! s

6.1.1

Suprascrierea metodelor

Denitie 8 Atunci cnd a ntr-o subclas modicm implementarea unei metode a a motenite de la o superclas spunem c suprascriem sau redenim metoda respectiv. s a a a

class VideoDevice extends Device { ... public String load() { return producer + " " + super.load(); } ... }

exemlul de mai sus metoda load din clasa VideoDevice, redenete metoda load din In s clasa Device. Mai mult, noua metod a ndeplinete i cerita de mai sus ca, cazul s s n camerelor video, pe lng lmul propriu-zis s se transfere i numele productorului a a a s a echipamentului. Redenirea unei metode dintr-o superclas a ntr-o subclas a nseamn a declararea unei metode subclas cu EXACT aceeai semntur ca a n a s a a metodei din superclas. a Spunem despre o metod suprascris c este o specializare (ranare de a a a comportament) a metodei din clasa de baz doar cazul care aceasta a n n apeleaz metoda din superclas. Este bine ca o metod suprascris s e o specializare. a a a a a

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

92

LECTIA 6. POLIMORFISMUL

Implementarea metodei load din clasa VideoDevice este o specializare deoarece ea apeleaz metoda load motenit de la clasa Device prin instructiunea super.load(). a s a Sectiunea 3.4.2 am spus c este necesar o modicare a metodei In a a toString. De fapt, modicarea despre care era vorba nu era altceva dect a suprascrierea unei metode motenite din clasa Object. s

6.1.2

Legarea dinamic. Polimorsmul. a

sectiunea anterioar am redenit metoda load clasa VideoDevice. Acum haideti In a n s vedem cum poate aceasta apelat. Un prim mod de apel al metodei este cel de a a mai jos, prin intermediul unei referinte de tip VideoDevice.
VideoDevice video = new VideoDevice("myVideo","XCompany"); System.out.println(video.load()); //Se va afisa "XCompany myVideo"

Oare ce se va aa a la executia codului de mai jos? s ns


Device otherVideo = new VideoDevice("myVideo","XCompany"); System.out.println(otherVideo.load());

La prima vedere am tentati s spunem c se va aa doar myVideo deoarece a a s referinta otherVideo este de tip Device i se va executa codul metodei load din clasa s respectiv. Lucrurile nu stau a deloc aa iar pe ecran se va aa XCompany a ns s s myVideo!!! Explicatia este c, de fapt, nu se apeleaz metoda load existent clasa a a a n Device ci metoda load existent clasa VideoDevice. a n Denitie 9 Asocierea dintre apelul la un serviciu (apel de metod) i implementarea a s acestuia (implementarea metodei ce se va executa la acel apel) se numete legare. s limbajele de programare exist dou tipuri de legare: In a a Legare static (early binding) : asocierea dintre un serviciu i implementarea acesa s tuia se realizeaz la compilare programului. Cu alte cuvinte, se cunoate din a s momentul compilrii apelului metodei care este implementarea metodei ce se va a executa la acel apel. Legare dinamic (late binding) : asocierea dintre un serviciu i implementarea a s acestuia se realizeaz la NUMAI la executia programului. Cu alte cuvinte, se a va cunoate doar mometul executiei apelului care implementare a unei metode s n se va executa la respectivul apel. Java, legarea apelurilor la metode nestatice se realizeaz majoritatea cazurilor In a n dinamic!!! Aceasta este explicatia tipririi mesajului XCompany myVideo la rularea a

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

6.1. CE ESTE POLIMORFISMUL?

93

exemplului de mai sus. La executia apelului metodei load, suportul de executie Java vede c referinta otherVideo indic un obiect VideoDevice i ca urmare execut implea a s a mentarea metodei load din clasa VideoDevice. Dac referita ar indicat o instant a a a clasei Device atunci s-ar apelat implementarea metodei load din clasa Device. S revenim acum la codul din clasei USB i mai exact la metoda trasferDeviceToPC. a s Obiectul referit de parametrul device este cunoscut magistralei USB doar prin intermediul interfetei sale (totalitatea metodelor publice) denite cadrul clasei Device. n Atunci cnd aceasta solicit operatia load obiectului referit de device, modul care a a n operatia va executat depinde de tipul concret al obiectul referit de device. Dac a a obiectul e instant a clasei VideoDevice se va executa metoda load din aceast clas a a a i prin urmare se va transfera i numele productorului echipamentului. Altfel se va s s a executa metoda load din clasa Device. Prin urmare, clasa USB poate folosit a n continuare nemodicat pentru a trasfera date a ntre orice fel de echipament periferic i s calculator. Polimorsmul este ansamblul format de motenirea de tip i legarea dinamic. El ne s s a permite s tratm uniform obiecte de tipuri diferite (prin motenirea de tip) i acelai a a s s n s timp mod particular ecare tip de obiect dac e necesar (prin legarea dinamic). n a a

6.1.3

Clase i metode abstracte s

Informatia stocat de o camer video este, general, un lm care este rezultatul a a n serviciului de lmare oferit de camer. Putem transfera lme de pe calculator spre a camera video dar scopul pentru care aceasta a fost proiectat este de a lma i nu de a a s pstra informatii. Un dispozitiv periferic care nu poate face nimic afar de transferul a n a bidirectional al datelor nu este de nici un folos (chiar i stilourile de memorie, afar s n a de transferul bidirectional al datelor, mai ofer i serviciul de scriere protejat). Orice as a dispozitiv trebuie s e ceva, cazul nostru o camer video sau foto. a n a Clasa Device a fost creat de fapt pentru a stabili o interfat comun pentru toate a a a subclasele sale. Intruct un obiect al clasei Device nu este de fapt de nici un folos, a trebuie ca operatia de instantiere a acestei clase s nu e posibil. a a Denitie 10 O clas abstract este o clas care nu poate instantiat. a a a a Declarm o clas ca ind abstract dac prexm cuvntul cheie class de cuvntul a a a a a a a cheie abstract, ca mai jos:
abstract class Device { ... }

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

94

LECTIA 6. POLIMORFISMUL

Exemplul de mai sus nu ar fost greit dac nu am declarat clasa s a Device abstract. Faptul c ea a devenit abstract a a a mpiedic instantierea a ei accidental i mrete gradul de elegere al codului; de ecare dat as a s nt a cnd vedem o clas abstract tim c ea este o interfat comun pentru a a as a a a toate subclasele sale. S considerm un alt exemplu. Cercul, ptratul i rombul sunt obiecte guri geometrice a a a s i ecare din aceste guri tie s-i calculeze aria. Prin urmare clasele lor ar putea s s as derivate dintr-o clas abstract FiguraGeometrica. Mai mult, a a ntruct ecare gur a a geometric are o arie, este normal ca FiguraGeometrica s contin metoda public oat a a a arie(). Se pune a problema ce implementare va avea aceast metoda clasa de baz ns a n a deoarece ecare gur geometric concret are un mod propriu de calcul al ariei? O a a a prim variant este prezentat mai jos. a a a
abstract class FiguraGeometrica { public float arie() { return 0; } ... }

Din pcate nici o gur geometric nu poate avea aria 0, deci metoda arie de mai sus a a a nu va specializat de nici o subclas a clasei FiguraGeometrica. Mai exact, ecare a a subclas a clasei FiguraGeometrica va reimplementa total metoda arie. Cu alte cuvinte, a aceast implementare a metodei arie este inutil i nu folosete nimnui. plus, este a as s a In posibil ca interiorul unei subclase s uitm s suprascriem metoda arie i atunci n a a a s n mod cert aria nu va calculat corect. a Varianta corect acest caz este ca metoda arie s e abstract, ea neavnd nici o a n a a a implementare clasa de baz FiguraGeometrica. n a
abstract class FiguraGeometrica { public abstract float arie(); ... }

Spuneam Sectiunea 3.1 c anumite conditii corpul unei metode n a n poate lipsi. O metod abstract nu are niciodat o implementare, deci a a a corpul acesteia ntotdeauna lipsete. Datorit acestui fapt compilatorul ar semnalat s a o eroare dac am a ncercat s-i dm o implementare metodei arie. a a

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

6.2. PRINCIPIUL DE PROIECTARE INCHIS-DESCHIS

95

O clas poate abstract chiar dac aceasta nu contine nici o metod a a a a abstract. a Dac o clas contine cel putin o metod abstract, atunci respectiva clas a a a a a va trebui i ea declarat ca ind abstract, caz contrar semnalndu-se s a a n a o eroare la compilare. O subclas a unei clase abstracte trebuie s implementeze toate metodele a a abstracte ale supercalsei sale, caz contrar ind necesar ca i subclasa n s s e abstract. Acest fapt este normal indc nu pot instantiate clase care contin a a a servicii neimplementate!

6.2

Principiul de Proiectare Inchis-Deschis

Atunci cnd vrem s realizm un sistem software, nu putem trece direct la faza de scriere a a a a codului surs. Procesul de realizare al unui program este compus din mai multe faze, a printre care i aa numita faz de proiectare. Proiectarea unui sistem software se face s s a pe baza unor principii iar Principiul Inchis-Deschis, sau The Open-Closed Principle, este unul dintre cele mai importante. Denitie 11 Principiul OCP ne sugereaz s proiectm un program astfel at en a a a nc titile software (clase, module, functii, etc) s e deschise pentru extensii dar at a nchise pentru modicri [3]. a Modulele care se conformeaz cu acest principiu au dou caracteristici principale: a a Deschise pentru extensii - acest caz ce se poate extinde nu este altceva dect n a comportamentul modulelor. Inchise pentru modicri - extinderea comportamentului modulelor nu duce la moa dicri asupra codului respectivelor modulelor. a Clasa USB a fost proiectat innd cont de acest principiu. Comportamentul su a t a a poate extins prin adugarea de noi dispozitive (de exemplu introducnd o subclas a a a Imprimanta a clasei Device) sensul c ea poate utilizat atunci pentru a transfera n a a informatii ntre un calculator i un nou tip de periferic (adic o imprimant). acelai s a a In s timp, clasa USB va rmne nemodicat la nivel de cod surs. Haideti s vedem ce a a a a a s-ar amplat dac nu ar fost respectat principiul OCP. Avem mai jos o variant a nt a a clasei USB care nu respect acest principiu (din economie de spatiu am reprodus doar a metodele de transfer de la calculator la periferic i nu i invers). s s

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

96

LECTIA 6. POLIMORFISMUL

class USB { public void transferPCToDevice(PC pc, PhotoDevice device) { String data; data = pc.load(); device.store(data); System.out.println("PC -> Device " + data); } public void transferPCToDevice(PC pc, VideoDevice device) { String data; data = device.load(); pc.store(data); System.out.println("PC -> Device " + data); } }

Problema acestei variante a clasei USB const faptul c ea cunoate diferitele tipuri a n a s de dispozitive periferice existente iar momentul introducerii de noi subclase a clasei n Device,de exemplu NewDevice, clasei USB va trebuit s i se adauge metoda: a
public void transferPCToDevice(PC pc, NewDevice device) { ... System.out.println("PC -> Device " + data); }

Si totui, care este marea problem? Doar nu este aa de greu s adugm s a s a a a o metod cu acelai continut ca i restul, avnd doar un parametru schima s s a bat! Ei bine, problema este mult mai grav dect pare la prima vedere. a a Gnditi-v c de ecare dat cnd achizitionati un nou dispozitiv ce trea a a a a buie s comunice prin intermediul magistralei USB cu propriul calculator, trebuie s a a mergeti ai la un service de calculatoare pentru a modica magistrala USB!!! Exact nt aa stau lucrurile i aici: la ecare creare a unei clase derivate din clasa Device clasa s s USB va trebui modicat i recompilat!!! as a Se poate observa c implementrile celor dou metode transferPCToDevice sunt idena a a tice. Spunem c a ntre cele dou metode exist o duplicare de cod. Duplicarea de cod a a existent cadrul unui sistem este o surs serioas de probleme. Presupunem c la un a n a a a moment dat cadrul transferului se dorete s se aeze pe ecran loc de PC -> n s a s n Device un alt ir de caractere. Este evident c va trebui modicat codul mai multe s a n locuri, nu doar unul singur. n S vedem acum o alt variant a clasei USB care implementarea metodei transfera a a n PCToDevice arat felul urmtor: a n a

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

6.3. SUPRA ARCAREA VERSUS SUPRASCRIEREA METODELOR INC

97

class USB { public void transferPCToDevice(PC pc, Device device) { String data; data = pc.load(); device.store(data); if (device instanceof PhotoDevice) System.out.println("PC -> PhotoDevice " + data); else if (device instanceof VideoDevice) System.out.println("PC -> VideoDevice " + data); } }

Evident c aceast implementare nu respect OCP, la adugarea unui nou tip de disa a a a pozitiv ind necesar modicarea metodei. a Incercati s scrieti programe astfel at acestea s nu contin duplicare a nc a a de cod i nici secvente if-then-else care veric tipul concret al unui obiect. s a Duplicarea de cod i secventele lungi if-then-else de acest fel sunt semne c undeva nu s a utilizati polimorsmul dei ar trebui. s

6.3

Supra arcarea versus suprascrierea metodelor nc

exemplul de mai jos, clasa D, loc s suprascriem metoda oMetoda am supra arIn n n a nc cat-o. literatur supra arcarea metodelor este cunoscut sub numele de In a nc a overloading iar suprascrierea sub numele de overriding.
class B { public void oMetoda(Object o) { System.out.println("BBBB.oMetoda"); } ... } class D extends B{ public void oMetoda(B b) { System.out.println("DDDD.oMetoda"); } ... }

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

98

LECTIA 6. POLIMORFISMUL

Din punctul de vedere al compilatorului acest fapt nu reprezint o problem dar coma a portamentul metodei supra arcate s-ar putea s nu e acela dorit de noi. nc a
B b = new B(); B d = new D(); d.oMetoda(b); //Se va afisa BBBB.oMetoda

Poate ce am dorit noi s se aeze este DDDD.oMetoda dar acest fapt nu se ampl a s nt a deoarece clasa B nu contine nici o metod cu semntura oMetoda(B), acest caz a a n apelndu-se metoda oMetoda(Object) din clasa de baz. a a Pentru ca o metod dintr-o clas derivat s se apeleze polimorc OBLIa a a a GATORIU trebuie ca aceasta s suprascrie i nu s supra a s a ncarce o metod a din clasa de baz. a

6.4

Constructorii si polimorsmul

class SuperClasa { protected int valoareSuperClasa; public SuperClasa() { valoareSuperClasa = valoareImplicita(); } public int valoareImplicita() { return 10; } public int getValoare() { return valoareSuperClasa; } } class SubClasa extends SuperClasa { private int valoareSubClasa; public SubClasa() { valoareSubClasa = 20; }

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

6.5. TABLOURILE SI POLIMORFISMUL

99

public int valoareImplicita() { return valoareSubClasa; } }

Presupunnd c am denit clasele de mai sus, oare ce se va aa (i ce am dori s se a a s s a aeze) urma executiei secventei de mai jos? s n
SubClasa ss = new SubClasa(); System.out.println("Valoarea este " + ss.getValoare());

Poate c noi ne-am dori ca efectul s e tiprirea irului de caractere Valoarea este a a a s 20, numai c loc de acesta se va tipri Valoarea este 0!!! a n a Dac constructorul unei superclase se apeleaz o metod care este a n a a suprascris subclas, la crearea unui obiect al subclasei exist riscul a n a a ca metoda respectiv s refere cmpuri a neinitializate momentul a a a nc n apelului. Pentru exemplul de mai sus s urmrim ce se ampl la instantierea unui obiect al a a nt a clasei SubClasa. 1. se initializeaz cmpurile cu valorile implicite corespunzatoare tipurilor lor, deci a a n cazul nostru cu 0. 2. se apeleaz constructorul SubClasa care apeleaz constructorul SuperClasa. a a 3. constructorul SuperClasa apeleaz metoda suprascris valoareImplicita; datorit a a a faptului c metoda este suprascris, implementarea apelat este cea din SubClasa a a a i nu cea din SuperClasa iar indc atribuirea valoareSubClasa = 20 a nu s-a s a nc realizat metoda va ntoarce valoarea 0!!! 4. se revine constructorul SubClasa i abia acum se execut atribuirea din acest n s a constructor.

6.5

Tablourile i polimorsmul s

exemplul de mai jos am creat un tablou ale crui elemente sunt referinte de tipul In a Device. Faptul c am scris new Device[10] NU a nseamn c am creat 10 obiecte de tip a a Device ci doar c am instantiat un tablou de dimensiune 10, ecare intrare a tabloului a ind o referint de tip Device. a
Device[] devices = new Device[10];

acest moment, intrrile tabloului nu refer obiecte i se pune problema initializrii In a a s a lor. Ce fel de elemente putem aduga tablou, avnd vedere c Device este o clas a n a n a a abstract (presupunnd c am declarat-o aa)? a a a s

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

100

LECTIA 6. POLIMORFISMUL

devices[0] = new VideoDevice("video","company");

Rspunsul la problem este simplu. Tinnd cont de motenirea de tip, i acest caz a a a s s n putem utiliza o instant a unei subclase locul unei instante a superclasei sale i deci, a n s codul de mai sus este absolut corect.

6.6

Exercitii

1. Modicati ultima implementare a metodei transferPCToDevice din Sectiunea 6.2 astfel at aceasta s respecte principiul OCP iar apelul acesteia s produc acelai nc a a a s efect. Puteti modica oricare din clasele Device, PhotoDevice i VideoDevice. Care s sunt beneciile modicrii? a 2. Modicati corespunztor clasa B din Sectiunea 6.3 astfel at apelul metodei oMe a nc toda din exemplul dat s se fac polimorifc. a a 3. La ghieul de s ncasri a taxelor locale se prezint un contribuabil. Operatorul de la a a ghieu caut contribuabilul (dup nume sau CNP), spune ct are de pltit pentru s a a i a a anul curent total pentru toate proprietile dup care poate n at a ncasa bani (o sum a total sau partial). Fiecare contribuabil poate detine mai multe proprieti: cldiri a a at a i/sau terenuri. Fiecare proprietate e situat la o adres (o adres are strad i s a a a a s numr). Suma datorat ecare an pentru ecare tip de proprietate se calculeaz a a n a felul urmtor: n a pentru cldire: 500 * suprafata cldirii(m2 ) a a pentru teren: 350 * suprafata terenului(m2 ) / rangul localitii care se a at n a terenul. Rangul unei localiti poate 1, 2, 3 sau 4. at Contribuabilul, indiferent dac pltete sau nu, poate solicita un utura cu toate a a s s proprietile pe care le detine alturi de suma pe care trebuie s o plteasc anul at a a a a n curent pentru o proprietate (uturaul arat la fel indiferent dac pentru anul s a a n curs contribuabilul a achitat ceva sau nu). Fluturaul are urmtoarea structur: s a a
Contribuabil: Ion Popescu Proprietati Cladire: Strada V Parvan Nr. 2 Suprafata: 20 Cost: 10000 Teren: Strada V. Parvan Nr. 2 Suprafata: 10, Rang: 1 Cost: 3500

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

6.6. EXERCITII

101

Cladire: Strada Lugoj Nr. 4 Suprafata: 25 Cost: 12500 Suma totala: 26000

Se cere: s se construiasc diagrama UML pentru clasele necesare la realizarea operatiilor a a descrise anterior. s se implementeze o parte din clasele identicate mai sus astfel at s a nc a poat executat operatia: operatorul, dup ce a gsit contribuabilul Ion a a a a Popescu, aeaz uturaul coresupunztor acestui contribuabil. metoda s a s a In main se instantiaz clasa ce modeleaz conceptul de contribuabil, se seteaz a a a proprietatile aferente acestuia dupa care se face aarea lor. s 4. Se cere s se modeleze o garnitur de tren. Se va deni acest scop o clasa Tren. a a n Un obiect de tip Tren contine mai multe referinte spre obiecte de tip Vagon care sunt pstrate a ntr-un tablou. Un vagon poate de 3 tipuri: CalatoriA, CalatoriB i Marfa. Despre garnitura de tren i vagoane mai cunoatem urmtoarele: s s s a un tren poate contine maxim 15 vagoane, indiferent de tipul vagoanelor. un vagon de tip CalatoriA are capacitatea de 40 pasageri i 300 colete potale. s s furnizeaz dou servicii pentru deschiderea, respectiv a a nchiderea automat a a uilor. s un vagon de tip CalatoriB are capacitatea de 50 pasageri i 400 colete potale. s s furnizeaz dou servicii pentru deschiderea, respectiv a a nchiderea automat a a uilor. s ind un vagon mai nou, furnizeaz un serviciu automat pentru blocarea a geamurilor. un vagon de tip Marfa are capacitatea de 400 colete potale. s nu furnizeaz servicii pentru deschiderea, respectiv a nchiderea automat a a uilor, aceste operatii executndu-se manual s a Clasa Tren dispune de un constructor prin intermediul cruia se vor ataa vagoanele a s constituente. Se cere: s se construiasc diagrama UML pentru clasele identicate pe baza descrierii a a anterioare.

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

102

LECTIA 6. POLIMORFISMUL s se implementeze clasa care modeleaz conceptul de vagon a a mpreun cu evena tualele sale clase derivate. Se mentioneaz c apelurile serviciilor pentru de a a schiderea, respectiv nchiderea uilor, blocarea geamurilor vor aa pe ecran s s un mesaj corespunztor, spre exemplu, apelul serviciului pentru blocarea geaa murilor ar putea tipri Geamurile s-au blocat. a s se implementeze o metod pentru determinarea egalitii dintre dou trenuri, a a at a presupunndu-se c dou trenuri sunt egale dac pot transporta acelai numr a a a a s a de colete, precum i o metod pentru aarea tipurilor de vagoane existente s a s ntr-un tren (ATENTIE: Tipul unui vagon trebuie determinat prin apeluri polimorce). s se scrie o metod main pentru exemplicarea apelurilor celor 2 metode a a denite la punctul precedent.

5. Considerm o colectie de greuti cadrul creia elementele sunt retinute sub a at n a forma unui tablou. Fiecare greutate are o anumit capacitate care poate obtinut a a apelnd metoda public int capacitate() pe care o are ecare greutate. Greutile a at pot de urmtoarele tipuri: a simple, a cror capacitate este setat prin constructor. a a duble, adic formate din 2 greuti ale cror capaciti sunt setate prin cona at a at structor iar capacitatea acestui tip de greutate e egal cu suma capacitilor a at celor dou greuti continute. a at multiple, care reprezint o siruire de greuti simple, duble, i/sau evena n at s tual alte greuti multiple. Cu alte cuvinte, o greutate multipl reprezint o at a a siruire de greuti. Capacitatea unei greuti de acest tip este egal cu suma n at at a capacitilor greutilor componente. Componentele acestui tip de greutate at at se seteaz prin constructorul clasei, dar se poate alege i o alt modalitate de a s a inserare a componentelor. Sistemul mai cuprinde i clasa ColectieGreutati care contine un tablou de greuti s at (acestea reprezint continutul efectiv al colectiei). Clasa ColectieGreutati va contine a urmtoarele metode: a public void adauga(Greutate g): are rolul de a aduga elemente tabloul de a n greuti. Presupunem c o colectie de greuti are o capacitate maxim de at a at a greuti care se seteaz prin intermediul constructorului. at a public double medie(): returneaz greutatea medie a colectiei (capacitate/numar a de greutati). Se cere: diagrama UML pentru clasele prezentate mai sus. implementarea claselor prezentate diagram. n a

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

6.6. EXERCITII

103

o metod main care se va crea un obiect ColectieGreutati, cteva greuti a n a at simple, duble i multiple care vor adugate colectiei de greuti. Se va aa s a at s greutatea medie a colectiei.

Bibliograe
1. Bruce Eckel. Thinking in Java.(2nd Edition). http://www.mindview.net/Books/TIJ. Capitolul 7, Polimorsmul. 2. Radu Marinescu, Carmen De Sabata. Ingineria Programrii 1. Indrumtor de a a laborator. Casa Crtii de Stiint, 1999. Lucrarea 6, Interfete i polimorsm. a a s 3. Robert C. Martin. Agile Software Development. Principles, Patterns and Practices. Prentice Hall, 2003. Capitolul 9, OCP.

(c) Ed. Politehnica Timisoara. 2006. C. Marinescu http://www.cs.utt.ro/~cristina, P. Mihancea http://www.cs.utt.ro/~petrum.

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