Programare Orientat A Pe Obiecte: Curs 6 Polimorfism Clase Abstracte
Programare Orientat A 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 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
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
lu 5/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse
Polimorfism
Polimorfism
Decizii luate la compilare vs. ı̂n timpul execut, iei
lu 7/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse
Polimorfism
Decizii luate la compilare vs. ı̂n timpul execut, iei
lu 8/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse
Polimorfism
Decizii luate la compilare vs. ı̂n timpul execut, iei
Polimorfism
Exemplu
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:
lu 13/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse
Polimorfism
Legarea dinamică
lu 14/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse
lu 15/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse
Polimorfism
lu 16/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse
Polimorfism
Exemplu 2:
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()"); }
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
lu 23/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse
Clase abstracte
Exemplu
import java.util.ArrayList;
import java.util.List;
Clase abstracte
Exemplu
@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
@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
@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
lu 29/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse
class Parinte {
Parinte() {
System.out.println("Constructorul Parinte apelat");
// Apeleaza metoda suprascrisa in clasa Copil
afiseaza();
}
void afiseaza() {
System.out.println("Afisare Parinte");
}}
Explicat, ie
lu 31/ 40
Polimorfism Clase abstracte Concluzii si Exercitii Propuse
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
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.
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
gest.validareFormulare();
gest.afisareToateFormularele();
}
}
lu 40/ 40