Sunteți pe pagina 1din 6

ROMNIA

Universitatea Politehnica din Bucuresti


Facultatea de Antreprenoriat, Ingineria si Managementul
Afacerilor

Programarea Calculatoarelor II - Laboratorul 5

Responsabil: As.univ. Drd. Ing. Bogdan Tiganoaia, bogdantiganoaia@yahoo.com


Obiectivele laboratorului sunt urmatoarele:
Prezentarea notiunii de polimorfism
Lucrul cu polimorfism in Java

Prezentarea notiunii de polimorfism


Polimorfismul permite folosirea unui obiect in locul altui obiect (a unei subclase in
locul unei superclase). Prin aceasta sprijina scrierea de cod eficient cu costuri de
dezvoltare si intretinere reduse.
Este sustinut doar de limbajele care permit legarea intarziata la apelul metodelor.
Acest lucru se refera la modalitatea in care sunt generate in programul executabil
apelul rutinelor din program.

La limbajele cu "legare timpurie" adresa la care se face un apel spre o rutina se


stabileste la compilare si este scrisa in mod univoc in codul obiect rezultat.
La limbajele cu legare intarziata, adresa de apel a unei rutine (metode in cazul Java)
se stabileste doar in momentul rularii, functie de contextul in care apare apelul. In
acest fel, spre exemplu, daca se declara o referinta spre o clasa Persoana care
indica spre un obiect de tip Student, un apel al metodei afiseaza_date() va apela
corect metoda cu acest nume din clasa Student si pe cea din Persoana.
Pentru exemplificare se considera exemplul din figura urmatoare:

Clasa Bird este o clasa abstracta care modeleaza conceptul de pasare. Din ea sunt
derivate doua clase concrete si anume Goose (gasca) si Penguin (pinguin).
Pentru gestionarea migratiei pasarilor se foloseste o clasa separata numita BirdControler.
Aceasta clasa pune la dispozitie o metoda pentru realizarea migrarii denumita reLocate().
Problema rezida in a realiza corect deplasarea. In acest sens Gasca poate implementa

move() prin apelulul metodei proprii zboara(). Analog, Pinguinul poate implementa
move() prin apelulul metodei proprii inoata(). In momentul cand este apelata metoda
reLocate() din BirdControler, aceasta va invoca corect metodele move() din
subclasele clasei Bird. Rezultatul este ca pinguinul va inota iar gasca va zbura
pentru a realiza migrarea, chiar daca clasa BirdControler pastreaza referinte doar
spre clasa Bird.
2

Din acest exemplu rezulta de asemenea avantaje la nivelul implementarii si testarii.


Informatii despre o noua pasare pot fi adaugate simplu, fara a modifica clasa
BirdControler. In acest sens este suficient sa se deriveze o noua clasa din Bird, iar
aceasta sa implementeze propria metoda move(). Este evident ca adaugarea
acestei clase nu introduce erori in clasele existente deja, ca atare codul care
implementeaza

procesul

de

migratie

nu

mai

trebuie

retestat.

Polimorfismul se utilizeaza des pentru a trata unitar colectii de obiecte diferite.


Doua metode din aceeasi clasa se numesc supraincarcate (overloaded) daca:
1) Au acelasi nume
2) Difera prin numarul sau tipul argumentelor
3) Nu difera doar prin tipul returnat
Numele unei metode impreuna cu numarul si tipul argumentelor se numeste
semnatura metodei.
Task 1: Parcurgeti urmatorul cod, intelegand notiunea de metode supraincarcate.
public class Number {
private double n;
public Number(double n) {
this.n = n; }
public double getNumber() {
return n; }
public double add(double m) {
return n + m; }
public double add(Number m) {
return n + m.getNumber(); }
}

Task 2: Studiati si rulati urmatorul cod Java, observand efectul.


3

public class Number {


private double n;
public Number(double n) {
this.n = n; }
public double getNumber() {
return n; }
public double add(double m) {
return n + m; }
public double add(Number m) {
return n + m.getNumber(); }
public static void main(String args[])
{
Number a,b;
a=new Number(20);
b=new Number(20);
System.out.println(a.add(30.0));
System.out.println(b.add(b));
4

}
}
O metoda dintr-o clasa parinte poate fi suprascrisa (overrided) de o metoda din clasa
derivata daca:
1) Au acelasi nume
2) Au acelasi numar si tip de argumente
3) Au acelasi tip returnat
4) Drepturile de acces nu sunt mai restranse
O metoda nu poate fi suprascrisa decat o data intr-o clasa.

Legarea dinamica a metodelor:


In cazul unor metode suprascrise (overrided) nu se va sti decat la executie care dintre metode
va fi apelata.
La apelarea unei metode suprascrise, Java nu priveste la tipul referintei ci la tipul intern al
obiectului pentru care este apelata metoda
Player p1 = new Mp3Player();
Player p2 = new WavPlayer();

p1.play(); /* Se va apela metoda play() a clasei Mp3Player */


p2.play(); /* Se va apela metoda play() a clasei WavPlayer */

Task 3: Testati polimorfismul in Java, atat supraincarcarea cat si suprascrierea


metodelor. Exemplu: Realizati ierarhia de clase descrisa in figura de mai sus (Player,
Mp3Player, WavPlayer).
Bibliografie: http://www.opendrum.upt.ro/, Note de curs, Programarea in limbajul Java,
Gavrila Cristian, 2004.

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