0% found this document useful (0 votes)
2 views40 pages

Programare Orientat A Pe Obiecte: Curs 6 Polimorfism Clase Abstracte

The document discusses polymorphism and abstract classes in object-oriented programming, explaining how derived class objects can be treated as objects of their base class. It covers the rules for method invocation and the differences between compile-time and runtime decisions, emphasizing the importance of dynamic binding. Additionally, it defines abstract classes and their role in providing a general framework for subclasses to implement specific methods.

Uploaded by

birlea24
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
2 views40 pages

Programare Orientat A Pe Obiecte: Curs 6 Polimorfism Clase Abstracte

The document discusses polymorphism and abstract classes in object-oriented programming, explaining how derived class objects can be treated as objects of their base class. It covers the rules for method invocation and the differences between compile-time and runtime decisions, emphasizing the importance of dynamic binding. Additionally, it defines abstract classes and their role in providing a general framework for subclasses to implement specific methods.

Uploaded by

birlea24
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 40

Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Programare Orientată Pe Obiecte


Curs 6
Polimorfism
Clase abstracte

Noiembrie 2024

lu 1/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Polimorfism

lu 2/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Un obiect al unei clase derivate are mai mult de un tip

Un obiect al unei clase derivate are tipul clasei derivate şi are şi tipul
clasei de bază
Mai general, un obiect al unei clase derivate are tipul fiecăruia dintre
clasele din ascendenţa sa
De aceea, un obiect dintr-o clasă derivată poate fi asignat unei
variabile de tipul oricărui părinte/strămoş al său
Observaţi, totuşi, că relaţia nu merge şi invers!

lu 3/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Un obiect al unei clase derivate are mai mult de un tip


class Animal {
public void cumFace() {
Un obiect al unei clase derivate System.out.println("Sunet");
are tipul clasei derivate şi are şi } }
tipul clasei de bază: class Caine extends Animal {
public void cumFace() {
Un obiect dintr-o clasă derivată System.out.println("Latra!");
} }
poate fi asignat unei variabile de class Pisica extends Animal {
tipul oricărui părinte/strămoş al public void cumFace() {
său, dar invers nu se poate System.out.println("Miauna");
} }

class Main {
public static void main(String[] args) {
Animal a = new Animal();
Animal c = new Caine();
Animal p = new Pisica();
a.cumFace();
c.cumFace();
p.cumFace();
}
} lu 4/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Polimorfism

Poli = mai multe


Morphos = forme
Polimorfismul se referă la această proprietate a obiectelor de a avea
mai multe forme
Spre exemplu, un obiect de tip Persoana poate referi spre un obiect
de tip Student:
Persoana p= new Student("Ana", 2854);

lu 5/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Polimorfism

Se dă diagrama de clase: Facet, i implementarea JAVA


corespunzătoare diagramei de clase s, i
discutat, i ce credet, i că va afis, a codul
următori:
Persoana p[] = new Persoana[3];
p[0] = new Persoana("Ion");
p[1] = new Student("Ana", 1234);
p[2] = new Profesor("Mara", 8);
for(int i = 0; i < p.length; i++)
{
System.out.println( p[i] );
}

Rezultate afis, ate:


Ion
1234: Ana
8: Mara
lu 6/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Polimorfism
Decizii luate la compilare vs. ı̂n timpul execut, iei

Reguli pentru compilare:


Compilatorul cunoas, te doar tipul referint, ă al obiectului
Caută ı̂n clasa tipului referint, ă dacă există metoda care se dores, te a fi
apelată
S, i returnează antetul metodei (semnătura)

lu 7/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Polimorfism
Decizii luate la compilare vs. ı̂n timpul execut, iei

Reguli pentru execut, ie:


Se va urma tipul obiectului creat efectiv ı̂n momentul execut, iei
Semnătura returnată ı̂n momentul compilării trebuie să se potrivească
cu metoda din clasa actuală a obiectului
În cazul ı̂n care metoda nu este gasită ı̂n clasa actuală, se caută mai
sus ı̂n ierarhia de clase

lu 8/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Polimorfism
Decizii luate la compilare vs. ı̂n timpul execut, iei

Se dă diagrama de clase: Ce se ı̂ntâmplă la execut, ia următoarelor


variante de cod?
(v1):
Persoana p = new Student("Ana",1234);
p.getSID();

Răspuns: Eroare de compilare


Solut, ie: ((Student) p).getSID();

Pentru a evita erorile la execut, ie, folosit, i:


if( p instanceof Student ) {
// se executa doar daca p "este-un" Student la executia programului
( (Student)s ).getSID(); }

(V2): Student s = new Persoana(”Ion”);


Răspuns: Eroare de compilare
Solutie: nu există lu 9/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Polimorfism
Exemplu

Se dă diagrama de clase s, i codul:


public class Person {
public void method1() {
System.out.print("Person 1 "); }
public void method2() {
System.out.print("Person 2 "); }}

class Student extends Person {


public void method1() {
System.out.print("Student 1 ");
super.method1();
method2();//this.method2()
}
public void method2() {
System.out.print("Student 2 ");
}}

class Undergrad extends Student {


public void method2() {
System.out.print("Undergrad 2 ");
}} lu 10/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Polimorfism
Exemplu Cont.

lu 11/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Polimorfism
Exemplu Cont.

Observat, ii:
Se execută ı̂ntâi method1() din clasa Student, deoarece ı̂n clasa
Undergrad nu există o metodă cu acestă semnătură, astfel se execută
prima metodă gasită mergând ı̂n sus ı̂n ierarhia de clase. Se afis, ează
”Student 1”
Apoi se apelează method1() din clasa Person (indicată de apelativul
super, care ı̂n momentul compilării stabiles, te că apelul trebuie făcut
catre method1() din clasa Person). Se afis, ează ”Person 1”
Se apelează method2() din clasa Undergrad, deoarece compilatorul
interpretează apelul ”method2();” ca ”this.method2()”, unde this
se referă la obiectul din care se face apelul, s, i anume obiectul concret
creat ı̂n momentul execut, iei, care este de tip Undergrad

lu 12/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Polimorfism
Reguli pentru this s, i super

Reguli ı̂n ceea ce prives, te apelul metodelor folosind operatorii this s, i super:

Când apelăm o metodă cu super (ex: super.method1()), legarea se


face la compilare
Atunci se verifică care e clasa părinte
Când apelăm o metodă cu this (ex. this.method2(), sau pur s, i simplu
method2()), legarea se face ı̂n momentul execut, iei, ı̂n funct, ie de tipul
concret al obiectului creat
Aceasta mai poartă numele de legare dinamică

lu 13/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Polimorfism
Legarea dinamică

Apare atunci când decizia privind metoda de executat nu se poate lua


decât la execuţia programului
Este nevoie de ea atunci când:
Variabila este declarată ca având tipul superclasei şi
Există mai mult de o metodă polimorfică care se poate executa ı̂ntre
tipul variabilei şi subclasele sale

lu 14/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Cum se decide care este metoda de executat?

1 Dacă există o metodă concretă ı̂n clasa curentă, se execută aceea


2 În caz contrar, se verifică ı̂n superclasa directă dacă există acolo o
metodă; dacă da, se execută
3 Se repetă pasul 2, verificând ı̂n sus pe ierarhie până când se găseşte o
metodă concretă şi se execută
4 Dacă nu s-a găsit nici o metodă, atunci Java semnalează o eroare de
compilare

lu 15/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Polimorfism

O variabilă polimorfică poate părea a-şi schimba tipul prin legare


dinamică
Compilatorul ı̂nţelege ı̂ntotdeauna tipul unei variabile potrivit
declaraţiei
Compilatorul permite o anume flexibilitate prin modul de conformare
la tip
La execuţie, comportamentul unui apel de metodă depinde de tipul
de obiect, nu de variabilă
Exemplu:
Person p;
p = new Student();
p = new Undergrad();
p.method1();

lu 16/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Polimorfism
Exemplu 2:

public class Persoana {


public class Student extends
private String name;
Persoana {
public Person(String name) {
public Student(String name) {
this.name = name; }
super(name); }
public boolean isAsleep(int hr) {
public boolean isAsleep(int hr)
return 22 < hr || 7 > hr; }
{ //suprascriere
public String toString() {
return 2 < hr hr < 8 ;
return name; }
}
public void status(int hr) {
if (this.isAsleep(hr))
public static void main(String[]
System.out.println("Now offline:
args){
" + this);
Persoana p;
else
p = new Student("Vasile");
System.out.println("Now online:
p.status(1);
" + this);
}
}
}
}

Rezultate afis, ate:


Now online: Vasile
lu 17/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Ordinea executiei constructorilor


Ce se va afis, a la rulare?

class Mancare {
Mancare() { System.out.println("Mancare()");} }
class Paine {
Paine() { System.out.println("Paine()"); }}
class Cascaval {
Cascaval() { System.out.println("Cascaval()"); } }
class Salata {
Salata() { System.out.println("Salata()"); }}
class Pranz extends Mancare {
Pranz() { System.out.println("Pranz()");} }
class PranzaLaPachet extends Pranz {
PranzaLaPachet() { System.out.println("PranzaLaPachet()");
} }
class Sandwich extends PranzaLaPachet {
Paine b = new Paine();
Cascaval c = new Cascaval();
Salata s = new Salata();
Sandwich() { System.out.println("Sandwich()"); }

public static void main(String[] args) {


new Sandwich();
} lu 18/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

De ce este util polimorfismul?


Polimorfismul permite unei superclase să reţină ceea ce este comun,
lăsând specificitatea să fie tratată de subclase.
Să presupunem că AView include o metodă calcArea:
public class AView {
public double calcArea() { return 0.0; }
}

Atunci ARectangle trebuie scris as, a:


public class ARectangle extends AView {
public double calcArea() { return getWidth() * getHeight(); }
}

Iar AOval trebuie scris as, a:


public class AOval extends AView {
public double calcArea() {
return getWidth()/2. * getHeight()/2. * Math.PI; }}

Consideraţi acum:
public double coverageCost(AView v, double costPerSqUnit) {
return v.calcArea() * costPerSqUnit;
} lu 19/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Clase abstracte

lu 20/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Clase abstracte
Definit, ie: O clasă abstractă este o clasă declarată cu cuvântul cheie
abstract, care cont, ine cel put, in o metodă abstractă.
Metodele abstracte sunt metode fără implementare, ce vor fi definite
ı̂n subclase.
O clasă abstractă poate cont, ine variabile de instant, ă s, i metode
concrete.
Dintr-o clasă abstractă nu se poate instanţia nici un obiect
Fiecare subclasă a unei clase abstracte care va fi folosită pentru a
instanţia obiecte trebuie să ofere implementări pentru toate metodele
abstracte din superclasă
Clasele abstracte economisesc timp, deoarece nu trebuie să scriem
cod ”inutil” care n-ar fi executat niciodată
O clasă abstractă poate moşteni metode abstracte
dintr-o interfaţă sau
dintr-o clasă
Ele oferă o schemă generală pentru alte clase prin declararea de
metode abstracte care trebuie implementate ı̂n clasele derivate. lu 21/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Exemplu
Clasa abstracta Shape

Metode abstracte in clasa Shape: calculatePerimeter(),


calculateArea()
Subclase: implementează metodele concrete calculateArea şi
calculatePerimeter. lu 22/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Clasa abstracta Shape


Exemplu

Să se creeze clase JAVA care modelează diferite tipuri de forme


geometrice (cerc, pătrat s, i dreptunghi).
Clasa Shape are o metoda abstractă area() care va fi implementată
diferit de clasele Circle, Square, s, i Rectangle care mos, tenesc din
Shape.
Se va implementa o metodă calculateTotalArea care acceptă o listă
de forme (List¡Shape¿) s, i calculează aria totală a tuturor formelor,
fără a fi nevoie să s, tim tipul exact al fiecărei forme.
Clasa Shape are o variabila statica counter care contorizează câte
forme au fost create ı̂n cadrul aplicat, iei.

lu 23/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Clase abstracte
Exemplu

import java.util.ArrayList;
import java.util.List;

// Clasa abstracta de baza Shape


abstract class Shape {
String color;

public Shape(String color) {


this.color = color;
}

// Metoda abstracta pentru calcularea ariei, definita in fiecare


subclasa
public abstract double area();

// Metoda pentru afisarea detaliilor formei


public void display() {
System.out.println("Shape Color: " + color);
}
}
lu 24/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Clase abstracte
Exemplu

class Circle extends Shape {


double radius;

public Circle(String color, double radius) {


super(color);
this.radius = radius;
}

@Override
public double area() {
return Math.PI * radius * radius;
}

@Override
public void display() {
super.display();
System.out.println("Shape Type: Circle");
System.out.println("Radius: " + radius);
System.out.println("Area: " + area());
}
}
lu 25/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Clase abstracte
Exemplu

class Square extends Shape {


double side;

public Square(String color, double side) {


super(color);
this.side = side;
}

@Override
public double area() {
return side * side;
}

@Override
public void display() {
super.display();
System.out.println("Shape Type: Square");
System.out.println("Side: " + side);
System.out.println("Area: " + area());
}
}
lu 26/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Clase abstracte
Exemplu

class Rectangle extends Shape {


double length, width;

public Rectangle(String color, double length, double width) {


super(color);
this.length = length;
this.width = width;
}

@Override
public double area() {
return length * width;
}

@Override
public void display() {
super.display();
System.out.println("Shape Type: Rectangle");
System.out.println("Length: " + length + ", Width: " + width);
System.out.println("Area: " + area());
}
} lu 27/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Clase abstracte
Exemplu

public class ShapeTest {


// Metoda care calculeaza aria totala a unei liste de forme
public static double calculateTotalArea(List<Shape> shapes) {
double totalArea = 0;
for (Shape shape : shapes) {
totalArea += shape.area();
}
return totalArea;
}

public static void main(String[] args) {


List<Shape> shapes = new ArrayList<>();
shapes.add(new Circle("Red", 5));
shapes.add(new Square("Blue", 4));
shapes.add(new Rectangle("Green", 3, 6));
System.out.println("Displaying shapes details:\n");
for (Shape shape : shapes) shape.display();
// Calculam aria totala folosind polimorfismul
double totalArea = calculateTotalArea(shapes);
System.out.println("Aria totala a tuturor formelor: " +
totalArea);
} lu 28/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Metode Polimorfice ı̂n Constructori

În Java, polimorfismul permite suprascrierea metodelor ı̂n subclase.


Totus, i, apelarea metodelor polimorfice ı̂n cadrul unui constructor
poate duce la comportament neas, teptat.
Motiv: În timpul construct, iei, obiectul este ı̂ncă ı̂n proces de
init, ializare, iar câmpurile din subclase pot să nu fie ı̂ncă setate.

lu 29/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Metode Polimorfice ı̂n Constructori


Exemplu 1

class Parinte {
Parinte() {
System.out.println("Constructorul Parinte apelat");
// Apeleaza metoda suprascrisa in clasa Copil
afiseaza();
}
void afiseaza() {
System.out.println("Afisare Parinte");
}}

class Copil extends Parinte {


private String nume = "Copil";
@Override
void afiseaza() {
System.out.println("Afisare Copil: " + nume);
}}
public class Test {
public static void main(String[] args) {
new Copil();
}
}
lu 30/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Explicat, ie

Constructorul clasei Parinte apelează metoda ‘afiseaza()‘.


Rezultat: Când se face ‘new Copil()‘, constructorul din ‘Parinte‘
apelează metoda ‘afiseaza()‘ a clasei ‘Copil‘.
Problemă: Câmpul ‘nume‘ nu este ı̂ncă init, ializat când ‘afiseaza()‘
este apelată, ceea ce poate duce la valori ‘null‘ sau neas, teptate.

lu 31/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Metode polimorfice in constructori


Exemplu 2

abstract class Forma {


abstract void draw();
Forma() {
System.out.println("Forma() inainte de draw()");
draw();
System.out.println("Forma() dupa draw()");
} }
class FormaRotunda extends Forma {
private int raza = 1;
FormaRotunda(int r) {
raza = r;
System.out.println("FormaRotunda.FormaRotunda(), raza = " + raza);
}
void draw() {
System.out.println("FormaRotunda.draw(), raza = " + raza);
}
}
public class PolyConstructors {
public static void main(String[] args) {
new FormaRotunda(5);
}
} lu 32/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Metode polimorfice in constructori


Exemplu 2

Se va afisa:
Forma() inainte de draw(),
FormaRotunda.draw(), raza = 0,
Forma() dupe draw()”,
FormaRotunda.FormaRotunda(), raza = 5

lu 33/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Concluzii si Exercitii Propuse

lu 34/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Concluzii

Restrict, ii:
O clasă abstractă nu poate fi instant, iată direct.
Apelarea unei metode abstracte fără a fi implementată ı̂ntr-o
subclasă va genera o eroare de compilare.
Exemplu: Shape s = new Shape(); // Eroare de
compilare
Clase Abstracte vs. Interfet, e
Clasele abstracte pot cont, ine metode concrete s, i variabile de instant, ă.
Interfet, ele definesc doar metode fără implementare (până la Java 8).
În Java 8+, interfet, ele pot cont, ine metode implicite (default).
O clasă poate extinde doar o singură clasă abstractă, dar poate
implementa mai multe interfet, e.

lu 35/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Concluzii
Necesitatea Utilizării Claselor Abstracte

Avantaje
Structură comună s, i reutilizabilă.
Suport pentru polimorfism.

Dezavantaje
Nu permite mos, tenirea multiplă.
Poate complica ierarhiile de clase.

Clasele abstracte sunt utile pentru crearea unui model de bază.


Oferă o structură comună pentru clase derivate fără a impune
implementarea completă.
Oferă flexibilitate ı̂n definirea comportamentului diverselor clase.
Permit polimorfismul, unde obiectele de diferite clase pot fi tratate
uniform. lu 36/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Exercitii Propuse(1)
Realizati ierarhia de clase din figura
alăturată.
1 Într-o clasă cu metoda main()
instantiati un document de tip
Book si un document de tip
Email.
2 Adaugati la clasa Document o
metoda de afisare a informatiilor
despre Document (autori, data).
3 Adaugati in clasa Document o
metoda abstracta (in plus fata
de cele 3 metode). Discutati cu
colegii ce efect are aceasta
adaugare a metodei abstracte
asupra clasei !
lu 37/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Exercitii Propuse(2)
Realizati clasele Java care pentru un sistem de gestionare a formularelor
(ex. contact, ı̂nscriere, feedback). Includet, i următoarele clase:
Clasa abstractă Formular:
Atribute:
String titlu - titlul formularului.
Map<String, String> campuri - câmpurile formularului, unde
cheia este numele câmpului, iar valoarea este cont, inutul acestuia.
Metode:
Metodă abstractă validare() - validarea datelor specifice.
Metodă afisareFormular() - afis, ează titlul s, i toate câmpurile
formularului.
Clasa FormularContact:
Extinde Formular.
Atribute specifice: nume, email, mesaj.
Implementarea metodei validare():
Validează formatul email.
Verifică că nume s, i mesaj nu sunt goale.
lu 38/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Exercitii Propuse(2)
Clasa FormularInscriere
Extinde Formular.
Atribute specifice: nume, prenume, dataNasterii, telefon.
Implementarea metodei validare():
Verifică că nume s, i prenume nu sunt goale.
Validează formatul pentru dataNasterii s, i telefon.
Clasa FormularFeedback
Extinde Formular.
Atribute specifice: nume, rating, comentariu.
Implementarea metodei validare():
Verifică că rating este ı̂ntre 1 s, i 5.
Verifică că comentariu nu depăs, es, te 500 de caractere.
Clasa GestiuneFormulare:Gestionează lista de formulare s, i
permite adăugarea s, i validarea acestora.
Atribute: List<Formular> formulare
Metode:
adaugareFormular(Formular f) - adaugă un formular.
validareFormulare() - iterează s, i validează fiecare formular.
afisareToateFormularele() - afis, ează toate formularele. lu 39/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse

Exemplu de Utilizare

public class TestFormulare {


public static void main(String[] args) {
GestiuneFormulare gest = new GestiuneFormulare();
Formular contact = new FormularContact("Contact", "Ion Popescu
", "[email protected]", "Salut!");
Formular inscriere = new FormularInscriere("Inscriere", "Ana",
"Ionescu", "2000-05-10", "0723456789");
Formular feedback = new FormularFeedback("Feedback", "Mihai",
4, "multumit!");
gest.adaugareFormular(contact);
gest.adaugareFormular(inscriere);
gest.adaugareFormular(feedback);

gest.validareFormulare();
gest.afisareToateFormularele();
}
}

lu 40/ 40

You might also like