programare orientata obiect
DESCRIPTION
Programare Orientata Obiect. Curs 6 Conversii de date Clase si metode abstracte. Continutul cursului. Introducere Platforma Java, Clase si Obiecte Modificatori, Constructori Pachete. Incapsularea datelor Mostenirea / Extinderea claselor Conversii de date. Clase si metode abstracte. - PowerPoint PPT PresentationTRANSCRIPT
04/20/23 Curs 6 1
Programare Orientata Obiect
Curs 6Conversii de date
Clase si metode abstracte
04/20/23 Curs 6 2
Continutul cursului1. Introducere2. Platforma Java, Clase si Obiecte3. Modificatori, Constructori4. Pachete. Incapsularea datelor5. Mostenirea / Extinderea claselor6. Conversii de date. Clase si metode abstracte
04/20/23 Curs 6 3
Curs 6
1. Conversii de date2. Clase si metode abstracte
2.1 Definitii2.2 Metode abstracte2.3 Mostenirea claselor abstracte2.4 De ce sa folosim clase abstracte?2.5 Exemplu de implementare (1)2.6 Exemplu de implementare (2)
C6. Conversii de date1. Conversii de date
– Ierarhia de clase (vezi cursul 5)– Tipurile de date (obiectele) aflate mai sus in
ierarhie sunt considerate ca fiind mai generale, iar cele de jos mai specifice
– Conversii:– Conversia unui subtip in supertip (poate fi
verificata la compilare)– Conversia unui supertip in subtip (conversia
trebuie sa fie explicita)
C6. Conversii de date1. Conversii de date
– Conversie explicita: numele tipului de data (clasa) trebuie specificat in momentul conversiei– Exemple:
1) String str = “test”;Object obj1 = (Object)str; Object obj2 = str;
2) String str1 = “test”;Object obj = str1; String str2 = (String)obj;Double num = (Double)obj;
– Daca compilatorul nu poate sa isi dea seama daca o conversie este invalida, atunci va afisa o eroare in momentul compilarii
– Daca compilatorul nu poate sa isi dea seama daca o conversie este posibila sau nu, atunci nu va da eroare de compilare, dar programul se va intrerupe la executie daca conversia nu se poate realiza.
Exemplu: Student mosteneste Person
public class typeTest { static Person[] p = new
Person[10];
public static void main (String args[]) {
for (int i = 0; i < 10; i++) { if(i<5)
p[i] = new Student(); else
p[i] = new Person(); }
Person o1 = (Person)p[0];Person o2 = p[0];Student o3 = p[0];Student o4 =
(Student)p[0];Student o5 = p[9];Student o6 =
(Student)p[9];int x = p[0].getStudentNumber();
}}
%> javac typeTest.java
typeTest.java:17 incompatible typesfound : Personrequired : Student Student o3 = p[0]; ^
typeTest.java:19 incompatible typesfound : Personrequired : Student Student o5 = p[9]; ^
typeTest.java:21: cannot resolve symbolsymbol : method getStudentNumber ()location: class Person int x = p[0].getStudentNumber(); ^3 errors
Dupa ce se comenteaza liniile cu erori:
%> java typeTestException in thread “main”
java.lang.ClassCastException: Person at typeTest.main(typeTest.java:20)
C6. Conversii de date
C6. Conversii de date1. Conversii de date
– Tipul unui obiect poate fi aflat in momentul executiei programului folosind operatorul instanceof
if ( obj instanceof String){
String str2 = (String)obj;}
2.1 Definitie– O clasa abstracta este o clasa care nu poate fi
instantiata– O clasa abstracta poate fi doar mostenita– Declararea unei clase abstracte se face astfel:
[public] abstract class ClasaAbstracta [extends Superclasa]{// Declaratii uzuale// Declaratii de metode abstracte}
– O clasa abstracta poate contine aceleasi elemente membre ca o clasa obisnuita, la care se adauga declaratii de metode abstracte (fara nici o implementare).
C6. Clase abstracte
2.2 Metode abstracte– O clasa abstracta poate contine metode fara corp
(fara implementare). Acestea trebuie implementate in subclase.
– Toate metodele care nu au corp dintr-o clasa abstracta trebuie declarate, la randul lor, ca fiind abstracte
– Orice clasa care contine cel putin o metoda abstracta trebuie declarata abstracta
abstract class ClasaAbstracta {abstract void metodaAbstracta(); // Corectvoid metoda(); // Eroare
}
C6. Clase abstracte
2.3 Mostenirea claselor abstracteabstract class Person {
protected String name;. . .public abstract String getDescription();. . .
}
class Student extends Person {private String major;. . .public String getDescription() {
return “a student major in “ + major;}. . .
}
class Employee extends Person {private float salary;. . .public String getDescription() {
return “an employee with a salary of $ “ + salary;}. . .
}
C6. Clase abstracte
Person
Employee Student
2.4 De ce sa folosim clase abstracte?– In proiectarea unei aplicatii este uneori necesar
sa reprezentam concepte abstracte care sa nu poata fi instantiate si care sa foloseasca doar la dezvoltarea ulterioara a altor clase.
– O clasa abstracta poate pune la dispozitia subclaselor sale un model complet pe care trebuie sa-l implementeze, furnizand chiar implementarea unor metode comune tuturor claselor si lasand explicitarea altora fiecarei subclase in parte.
– Reprezinta o metoda de constrangere.
C6. Clase abstracte
2.5 Exemplu de implementare (1)– Descrierea obiectelor grafice intr-o maniera orientata-
obiect.• Obiecte grafice: linii, dreptunghiuri, cercuri, curbe Bezier, etc• Stari comune: pozitia(originea), dimensiunea, culoarea, etc• Comportament: mutare, redimensionare, desenare, colorare, etc.
– Descrierea obiectelor grafice intr-o maniera orientata-obiect.
– Pentru a folosi starile si comportamentele comune declaram o clasa generica GraphicObject care sa fie superclasa pentru celelalte clase.
– Metodele abstracte sunt folosite pentru implementarea comportamentului specific fiecarui obiect, cum ar fi desenarea iar cele obisnuite pentru comportamentul comun tuturor, cum ar fi schimbarea originii
C6. Clase abstracte
2.5 Exemplu de implementare (1)– Implementarea clasei GraphicObject
abstract class GraphicObject {// Stari comuneprivate int x, y;private Color color = Color.black;...// Metode comunepublic void setX(int x) {
this.x = x;}
public void setY(int y) {this.y = y;
}public void setColor(Color color) {
this.color = color;}...// Metode abstracteabstract void draw();...
}
C6. Clase abstracte
2.5 Exemplu de implementare (1)– Implementarea claselor pentru obiecte grafice ar putea fi:
class Circle extends GraphicObject {void draw() {// Obligatoriu de implementat...}
}class Rectangle extends GraphicObject {
void draw() {// Obligatoriu de implementat...}
}
C6. Clase abstracte
2.6 Exemplu de implementare (2)– Problema:
– Studentii sunt de trei tipuri (Undergraduate, PhD sau MsC). Fiecare obiect instantiat trebuie sa fie din unul din cele trei tipuri.
– Nu trebuie sa se instantieze niciun obiect din clasa Student
– Solutie:– Clasa Student se declara abstracta– Clasa Student este necesara pentru a cuprinde
aspectele comune tuturor studentilor.
C6. Clase abstracte
2.6 Exemplu de implementare (2)– Diagrama de clase:
C6. Clase abstracte
PhdStudent MscStudentUndergrad
2.6 Exemplu de implementare (2)
C6. Clase abstracte
public abstract class Student { protected String login, department, name;
public Student() {login = “”; department = “”; name = “”;
}
public void setLogin(String login) { this.login = new String(login);
}
public String getLogin() { return new String(login);
}}
public class PhdStudent extends Student{
private String supervisor;
public void setSupervisor(String login) {
...
04/20/23 Curs 6 18
Continutul cursului1. Introducere2. Platforma Java, Clase si Obiecte3. Modificatori, Constructori4. Pachete. Incapsularea datelor5. Mostenirea / Extinderea claselor6. Conversii de date. Clase abstracte7. Interfete