Java Mostenire si polimorfism Interfete si polimorfism n

  • Slides: 14
Download presentation
Java – Mostenire si polimorfism Interfete si polimorfism n n n concepte declarare, creare,

Java – Mostenire si polimorfism Interfete si polimorfism n n n concepte declarare, creare, utilizare supraincarcare si polimorfism Mostenire n n descriere ierarhii

Interfete - concepte n n n una dintre problemele de baza in Java este

Interfete - concepte n n n una dintre problemele de baza in Java este reutilizarea codului in cat mai multe proiecte; reutilizarea codului este deseori posibila numai dupa realizarea unor mici ajustari; o strategie de scriere a codului consta in separarea portiunilor reutilizabile in interfete, de cele ce sunt dependente de implementare; pentru a produce o aplicatie noua interfata se pastreaza insa acesteia i se ataseaza o noua clasa cu metodele de prelucare specifice noului de context de lucru; comportamentul codului variaza in functie de clasa care a fost atasata, fenomemul purand denumirea de polimorfism.

Interfete – declarare, creare si utilizare Se pune problema realizarii unei aplicatii pentru prelucrarea

Interfete – declarare, creare si utilizare Se pune problema realizarii unei aplicatii pentru prelucrarea unor obiecte grafice din categoria: punct, cerc, patrat, dreptunghi … Toate aceste obiecte grafice au caracteristici comune din categoria perimetru, arie, volum, insa formulele de calcul concrete difera de la caz. O modalitate de implementare cu reutuilizare de cod se prezinta in continuare. 1. Se declara o interfata ce sa contina toate public interface Interfata. Geometrica { double Perimetru(); metodele comune ale obiectelor double Arie(); 2. Se creeaza clasele ce implementeaza concret double Volum(); String Nume(); codurile (vezi slide-ul urmator) } 3. Se testeaza clasele create. public class Test { public static void main(String[] args) { Punct p = new Punct("n. Punct", 2. , 3. ); Cerc c= new Cerc("n. Cerc", p, 10. ); Interfata. Geometrica ig; ig = p; System. out. println(ig. Nume()+"n. Perimetru: "+ig. Perimetru()+"n. Arie: "+ig. Arie()); ig = c; System. out. println(ig. Nume()+"n. Perimetru: "+ig. Perimetru()+"n. Arie: "+ig. Arie()); } }

Interfete – declarare, creare si utilizare Noile clase cu implements trebuie sa defineasca metodele

Interfete – declarare, creare si utilizare Noile clase cu implements trebuie sa defineasca metodele din interfata. public class Cerc implements Interfata. Geometrica { String nume; Punct centru; double raza; } public class Punct implements Interfata. Geometrica{ String nume; double x, y; public Cerc(String nume, Punct p, double r) { this. nume=nume; centru=p; raza= r; } public Punct(String nume, double x, double y) { this. nume=nume; this. x=x; this. y=y; } public String Nume() { return nume; } public double Perimetru() { return 2. *Math. PI*raza; } public double Perimetru() { return 0. ; } public double Arie() { return Math. PI*raza; } public double Arie() { return 0. ; } public double Volum() { return 0. ; } }

Polimorfism n n cand mai multe clase implementeaza aceeasi interfata, fiecare clasa implementeaza metodele

Polimorfism n n cand mai multe clase implementeaza aceeasi interfata, fiecare clasa implementeaza metodele in moduri diferite; este legal sa avem o variabila de tipul interfata ca si in Interfata. Geometrica ig caz in care variabila ig poate referi orice obiect ce implementeaza interfata respectiva; polimorfismul face ca aceeasi metoda sa poate avea implementari distincte, adica codul se adapteaza la natura obiectului utilizat; in cazul supraincarcarii metoda de apelat este selectata inainte de rularea codului in faza de traducere de catre compilator, in cazul polimorfismului metoda de apelat se alege in timpul compilarii programului de catre masina virtuala

Mostenire n n n un mecanism pentru extinderea unei clase prin adaugarea de noi

Mostenire n n n un mecanism pentru extinderea unei clase prin adaugarea de noi metode sau variabile; clasa mai generala se numeste superclasa, clasa mai specializata ce mosteneste de la superclasa se numeste subclasa; in Java orice clasa extinde direct sau indirect clasa Object; mostenirea difera de implementarea unei interfete (interfata nu este o clasa, nu are stare sau comportament), subclasa mosteneste metodele si variabilele superclasei; din acest motiv efortul pentru scrierea superclasei se preia in subclasa; la definirea subclasei se pot realiza urmatoarele: n n n adaugarea de variabile de instanta; adaugarea de metode; modificarea sau extinderea unei metode deja existente.

Aplicatia 1 / 1 Dorim sa scriem o aplicatie care sa foloseasca obiecte punct

Aplicatia 1 / 1 Dorim sa scriem o aplicatie care sa foloseasca obiecte punct si coordonata, cel din urma fiind o subclasa a primei clase. Iata implementarea: public class Coordonate { private double x; private double y; Coordonate(){ set. X(0); set. Y(0); } Coordonate(double x, double y){ set. X(x); set. Y(y); } public void set. X(double x) { this. x = x; } public double get. X() { return x; } public double get. Y() { return y; } public void set. Y(double y) { this. y = y; } public String to. String() { return "(" + x + ", " + y + ")"; } } public class Punct extends Coordonate { private String nume; public Punct() { super(); set. Nume("P"); } public Punct(double x, double y) { super(x, y); set. Nume("P"); } public Punct(double x, double y, String nume) { this(x, y); set. Nume(nume); } public Punct(Coordonate c, String nume) { this(c. get. X(), c. get. Y()); set. Nume(nume); } public void set. Nume(String nume){ this. nume = nume; } public String to. String() { return nume + super. to. String(); } }

Aplicatia 1 / 2 n n subclasa nu are acces la membrii privati din

Aplicatia 1 / 2 n n subclasa nu are acces la membrii privati din superclasa; cuvantul cheie super se foloseste pentru apelarea unei metode din superclasa; orice referinta la subclasa se poate converti la o referinta la superclasa; apelul de metode este determinat de tipul actual al obiectului nu de catre tipul referintei la obiect. public class Mostenire { public static void main(String[] args) { Coordonate c 1 = new Coordonate(); Coordonate c 2 = new Coordonate(1, 2); Punct p 1 = new Punct(); Punct p 2 = new Punct(1, 1); Punct p 3 = new Punct(1, 2, "P 3"); Punct p 4 = new Punct(c 1, "P 4"); System. out. println(c 1); System. out. println(c 2); System. out. println(p 1); System. out. println(p 2); System. out. println(p 3); System. out. println(p 4); c 1 = p 1; //subclasa = superclasa System. out. println(c 1); c 1 = c 2; System. out. println(c 1); //p 1 = (Punct)c 1; // aici primim eroare //invers nu se poate! } }

Ierarhii de clase n n conceptele folosite pentru a scrie o aplicatie pot forma

Ierarhii de clase n n conceptele folosite pentru a scrie o aplicatie pot forma ierarhii; ierarhiile se reprezinta grafic sub forma arborescenta; conceptul cel mai general se afla la baza (sau radacina) in timp ce cele specializate reprezinta frunzele; Implementati o aplicatie cu ierarhia alaturata si ale caror clase si metode se implementeaza conform tabelului urmator:

Aplicatia 2/1 public class Punct extends Forma { private int x; private int y;

Aplicatia 2/1 public class Punct extends Forma { private int x; private int y; public Punct() { // apel implicit constructor Object } public Punct( int x. Value, int y. Value ) { // aici apel implicita constructor Object x = x. Value; y = y. Value; } public void set. X( int x. Value ) { x = x. Value; } public int get. X() { return x; } public void set. Y( int y. Value ) { y = y. Value; } public int get. Y() { return y; } public String get. Nume() { return "Punct "; } public String to. String() { return "(" + get. X() + ", " + get. Y() + ")"; } public class Forma { public double get. Arie() { return 0. 0; } public double get. Volum() { return 0. 0; } public String get. Nume() { return null; } } }

Aplicatia 2/2 public class Cerc extends Punct { private double raza; public Cerc() {

Aplicatia 2/2 public class Cerc extends Punct { private double raza; public Cerc() { // apel constructor implicit } public Cerc( int x, int y, double valoare. Raza ) { super( x, y ); // apel constructor Punct set. Raza( valoare. Raza ); } public void set. Raza( double valoare. Raza ) { raza = ( valoare. Raza < 0. 0 ? 0. 0 : valoare. Raza ); } public double get. Raza() { return raza; } public double get. Diametru() { return 2. * get. Raza(); } public double get. Perimetru() { return Math. PI * get. Diametru(); } public double get. Arie() { return Math. PI * get. Raza(); } public String get. Nume() { return "Cerc "; } public String to. String() { return "Centru = " + super. to. String() + "; Raza = " + get. Raza(); } }

Aplicatia 2/3 public class Cilindru extends Cerc { private double inaltime; public Cilindru() {

Aplicatia 2/3 public class Cilindru extends Cerc { private double inaltime; public Cilindru() { } public Cilindru( int x, int y, double raza, double h) { super( x, y, raza ); set. Inaltime( h ); } public void set. Inaltime( double valoare. Inaltime ) { inaltime = ( valoare. Inaltime < 0. 0 ? 0. 0 : valoare. Inaltime ); } public double get. Inaltime() { return inaltime; } public double get. Arie() { return 2 * super. get. Arie() + get. Perimetru() * get. Inaltime(); } public double get. Volum() { return super. get. Arie() * get. Inaltime(); } public String get. Nume() { return "Cilindru"; } public String to. String() { return super. to. String() + "; Height = " + get. Inaltime(); } }

Aplicatia 2/4 import java. text. Decimal. Format; import javax. swing. JOption. Pane; public class

Aplicatia 2/4 import java. text. Decimal. Format; import javax. swing. JOption. Pane; public class Test. Mostenire { public static void main( String args[] ) { Decimal. Format doua. Zecimale = new Decimal. Format( "0. 00" ); Punct punct = new Punct( 1, 7 ); Cerc cerc = new Cerc( 21, 7, 2. 5 ); Cilindru cilindru = new Cilindru( 21, 30, 3. 5, 11. 5 ); String output = punct. get. Nume() + ": " + punct + "n" + cerc. get. Nume() + ": " + cerc + "n" + cilindru. get. Nume() + ": " + cilindru + "n"; Forma tablou. De. Forme[] = new Forma[ 3 ]; // creare tablou Forme tablou. De. Forme[ 0 ] = punct; tablou. De. Forme[ 1 ] = cerc; tablou. De. Forme[ 2 ] = cilindru; for ( int i = 0; i < tablou. De. Forme. length; i++ ) { output += "nn" + tablou. De. Forme[ i ]. get. Nume() + ": " + tablou. De. Forme[ i ]. to. String() + "n. Area = " + doua. Zecimale. format( tablou. De. Forme[ i ]. get. Arie() ) + "n. Volume = " + doua. Zecimale. format( tablou. De. Forme[ i ]. get. Volum() ); } JOption. Pane. show. Message. Dialog ( null, output ); // display output System. exit( 0 ); } }

Bibliografie n n http: //www. east. utcluj. ro/mb/mep/antal/downloads. html > Java: course, IDE (JDeveloper),

Bibliografie n n http: //www. east. utcluj. ro/mb/mep/antal/downloads. html > Java: course, IDE (JDeveloper), JDK and JRE, JDeveloper labs. http: //docs. oracle. com/cd/E 18941_01/tutorials/jdtut_11 r 2_50/jdtut_11 r 2 _50. html > Getting Started With the JDeveloper IDE