Linguaggi Java Ereditarietà Fondazione ITS A. Volta – Linguaggi -Java – Flavia Lollis 0 Linguaggi Java Ereditarietà L’ereditarietà è uno dei concetti basilari della programmazione OO per ottenere la riusabilità del codice e non dover ogni volta ripartire da zero. Ereditare significa acquisire dei beni da altri, e nella programmazione OO è la proprietà che consente di creare nuove classi sulla base di quelle già esistenti, sfruttando quindi ciò che è già stato scritto. In OOP ereditare una classe B da un’altra classe A, significa creare una nuova classe B che acquisisce il bagaglio di proprietà (attributi e metodi) della classe A. La classe di partenza è detta classe base o superclasse, mentre quella che eredita viene denominata sottoclasse o classe derivata. Quadrupede è sottoclsse di Animale e superclasse di Cane. La classe derivata eredita tutte le caratteristiche della superclasse: attributi e metodi definiti nella superclasse risultano dunque presenti nella sottoclasse anche se non è fisicamente presente, ma c'è solo nella classe base. Nella programmazione OO pertanto si programma scrivendo delle sottoclassi alle quali si aggiungono caratteristiche e comportamenti che le specializzano rispetto la superclasse, ricordando però che la suddivisione in sottoclassi deve seguire un raggruppamento concettuale. I programmatori Java, a differenza di quelli C++, hanno scelto di non utilizzare l'ereditarietà multipla in quanto è abbastanza complessa e può portare a problemi logici anche molto complessi. Il rettangolo è un particolare quadrilatero, quindi dopo aver definito la classe Quadrilatero con i suoi attributi e metodi, posso derivare da essa la classe rettangolo Attributi: i lati del quadrilatero Metodi : costruttore, perimetro (somma dei lati), area (utilizzando la formula di Bretschneider : ove p è il semiperimetro, e sono gli angoli opposti di vertice A e B, pertanto prima di chiamare il metodo area del quadrilatero bisognerà procurarsi la misura degli angoli richiesti. Fondazione ITS A. Volta – Linguaggi -Java – Flavia Lollis 1 Linguaggi Java import java.lang.Math; public class Quadrilatero { int latoA, latoB, latoC, latoD; public Quadrilatero(int lA, int lB, int lC, int lD) { latoA=lA; latoB=lB; latoC=lC; latoD=lD; } public int perim() { return latoA + latoB + latoC + latoD; } public float area(double al, double be) { float p=perim()/2; float area_f; double area_calc; area_calc= (double) ((p-latoA)*(p-latoB)*(p-latoC)*(p-latoD)) (double) (latoA*latoB*latoC*latoD)*(Math.cos((al+be)/2))*(Math.cos((al+be)/2)); area_f=(float)Math.sqrt(area_calc); return area_f;} } Se dobbiamo trattare dei rettangoli però, vista la complessità della formula per calcolare l’area, è poco conveniente trattarli come quadrilateri. Se creiamo la classe rettangolo ereditandola dalla classe quadrilatero, possiamo riutilizzare tutto ciò che ci risulta comodo del quadrilatero e semplificare il metodo per calcolare l’area. public class Rettangolo extends Quadrilatero { public Rettangolo(int lA, int lB) { super(lA, lB, lA, lB); } public float area() { return latoA*latoB; } } Vediamo ora come utilizzare le classi: Fondazione ITS A. Volta – Linguaggi -Java – Flavia Lollis 2 Linguaggi Java public class UsaQuadrilateri { public static void main(String[] args) { Quadrilatero fig_quadril = new Quadrilatero(1,2,3,4); Rettangolo fig_rett = new Rettangolo(2,3); System.out.println("perimetro quadrilatero = " + fig_quadril.perim()); //* supponendo che gli angoli richiesti dalla formula di Bretschneider siano 40 e 75 System.out.println("area quadrilatero = " + fig_quadril.area(40,75)); System.out.println("perimetro rettangolo = " + fig_rett.perim()); System.out.println("area rettangolo = " + fig_rett.area(90, 90)); System.out.println("area rettangolo = " + fig_rett.areaR()); } } Analogamente possiamo ragionare per il quadrato public class Quadrato extends Rettangolo { public Quadrato(int L) { super(L, L); } public float areaQ() { return latoA*latoA; } } e nella classe UsaQuadrilatero basta aggiungere Quadrato fig_quad = new Quadrato(4); System.out.println("area quadrato = " + fig_quad.areaR()); System.out.println("area quadrato = " + fig_quad.areaQ()); Fondazione ITS A. Volta – Linguaggi -Java – Flavia Lollis 3