RELAZIONE 3 ANCARANI SILVIA OBIETTIVI: - uso ereditarietà - uso astrazioni - uso classi astratte DESCRIZIONE DEL PROBLEMA I PARTE: Creare un tipo di dato astratto che fornisca servizi per disegnare triangoli, rettangoli e cerchi. Si dispone già dell’astrazione Simple DrawPad di cui è fornita la documentazione e tutti i metodi che utilizza (escluso il file sorgente). Creare quindi un componente SW che testi il funzionamento della astrazione realizzata. II PARTE: Data la classe astratta Shape, derivare nuove classi concrete relative alle figure che si vogliono avere (triangoli, rettangoli, cerchi…), ognuna che specifiche come disegnarsi. ANALISI I PARTE: DrawPad La classe SimpleDrawPad è un’astrazione in grado di realizzare punti e linee e di definirne i colori e lo spessore delle linee usate. Essendo il mio scopo quello di costruire un’entità ADT in grado di fornire figure geometriche, mi servo proprio delle classe SimpleDrawPad e dei suoi metodi: infatti, se si combinano in modo opportuno linee e punti, si ottengono delle vere e proprie figure. Chiamerò il dato astratto DrawPad (classe base) e ciò significa che eredita dalla base tutti i metodi ed i dati; può inoltre inserire nuovi metodi e dati per realizzare le sue funzioni in modo ottimale. E’ importante specificare che la classe derivata DrawPad utilizza ma non modifica in nessun caso i metodi e dati della classe base SimpleDrawPad. Analizziamo ora come creare le figure geometriche desiderate. Prima di tutto specifico che nella finestra di visualizzazione grafica l’origine degli assi cartesiani è in altro a sinistra e l’asse delle ordinate è discendente. Per realizzare un triangolo basterà quindi passare le coordinate (x,y) relative ai 3 vertici ed unirle con le linee in modo opportuno. Se ho un triangolo rettangolo basterà passare le coordinate di 2 vertici, in quanto il 3° risulterà dalla combinazione delle coordinate dei primi due. Per realizzare un quadrato passerò le coordinate (x,y) dei 2 vertici opposti ed unire i 4 vertici che si ottengono. Importante è la realizzazione del cerchio che utilizza una funzione di passaggio da coordinate polari a cartesiane. Occorre infatti passare le coordinate del centro (x,y) e la lunghezza del raggio ra desiderata. Otteniamo che l’ascissa del cerchio sarà Xc= x + ra*sin(a) e l’ordinata sarà Yc= y + ra*cos(a), dove a è l’angolo di riferimento in un cerchio trigonometrico. Per potere utilizzare queste coordinate in modo da ottenere un cerchio, basterà invocare un metodo base “Math”. In ogni figura è anche possibile specificare il colore e lo spessore delle linee tracciate invocando i metodi della classe base SimpleDrawPad. Per quanto riguarda il componente SW che deve verificare il funzionamento di DrawPad, costruisco un oggetto (di tipo DrawPad) e gli faccio disegnare le figure che ho sviluppato. (vedi files Esempio.java, Esempioa.java ed EsempioB.java) II PARTE: La classe Shape rappresenta un tipo di dato astratto (figura) che si può realizzare con un SimpleDrawPad. Da Shape voglio derivare delle figure con proprie caratteristiche: colore e spessore della riga. Per ciò che riguarda le coordinate per disegnare le varie forme geometriche, sono le stesse specificate in DrawPad. Per quanto riguarda il settaggio del colore, utilizzo 3 dati che indicano la percentuale dei 3 colori base: rosso, verde e blu. Ogni figura estende quindi il concetto di Shape. Anche qui utilizzo un componente SW per verificare come funzionano i nuovi oggetti creati e lo chiamo Esempio2. PROGETTO I PARTE: Per creare delle figure utlizzo la classe pubblica DrawPad che è una sottoclasse di SimpleDrawPad che è stata fornita in un package tool. Dentro la DrawPad ho usato i metodi della classe base per disegnare triangoli, cerchi, rettangoli e forme geometriche in genere assegnando le opportune variabili. Avrò quindi le relative classi: - public void drawBox, - public void drawTriangle, - public void drawCircle con le relative variabili (coordinate dei vertici). Verifico poi il funzionamento creando il componente SW “Esempio” dove l’oggetto “pad” di tipo DrawPad viene creato ed usato per disegnare un triangolo, un rettangolo (quadrato) ed un cerchio invocando i metodi della classe DrawPad. II PARTE: Anche in questo caso occorre entrare nel package tool. Definisco poi una classe per ogni figura geometrica che voglio realizzare. Esse saranno tutte un’estensione di Shape ed avrò quindi: - public class Box extends Shape - public class Triangle extends Shape - public class Circle extends Shape IMPLEMENTAZIONE: DrawPad.java Codice e documentazione relativi alla classe DrawPad. Prima di tutto è necessario specificare all’inizio del codice “import tools.*” in modo che vengano importate tutte le classi necessarie. Ora posso creare la classe DrawPad con lo stesso costruttore della classe base SimpleDrawPad. Tutti i metodi che uso per disegnare le figure utilizzano quelli della classe SimpleDrawPad, quali “drawLine” per disegnare linee e “drawPoint” per i punti. Stessa cosa per assegnare i colori e lo spessore delle linee. Nel metodo usato per disegnare il cerchio, uso un ciclo di for del tipo: for (int a=0; a<360; a++) { Xc= x + ra*Math.sin(a); Yc= y +ra*Math.cos(a); E poi gli applico un metodo della SimpleDrawPad che è: drawPoint ((int)Xc, (int)Yc). Specificando che Xc e Yc ora sono degli interi mentre prima erano dei double. (ecco chiarito l’utilizzo della parenteri intorno ad “int”). Creo poi un componente SW di tipo DrawPad e lo chiamo “pad” (Esempio.java, EsempioA.java, EsempioB.java II PARTE: Anche in questo caso occorre specificare all’inizio del codice “import tools.*” in modo che vengano importate tutte le classi necessarie. In secondo luogo occore dichiarare delle variabili temporanee che mi servono per appoggiare i parametri che utilizzo per le figure. Utilizzo quindi i metodi della classe Shape: - pad.show() per visualizzare il pad; - pad.setCurrentThickness (getThickness()) per settare lo spessore della riga; - pad.setCurrentColor (getColorRedComponent(), getColorGreenComponent(), getColorBlueComponent()) per settare il colore. Anche qui utilizzo il metodo di SimpleDrawPad per disegnare le linee (pad.drawLine) e i punti (pad.drawPoint). Creo quindi un oggetto di tipo SimpleDrawPad e lo chiamo “pad” (vedi Esempio2). CASI D’USO I PARTE: Codice e documentazione relativi a: - Esempio.java - EsempioA.java - EsempioB.java II PARTE: Codice e documentazione relativi a Esempio2.java NOZIONI ACQUISITE I PARTE: Con questo progetto ho imparato le tecniche e l’uso dell’ereditarietà tra classi: infatti la classe DrawPad deriva dalla classe base SimpleDrawPad. La sottoclasse estende quella già esistente importando i dati ed i metodi della classe base ma non i costruttori. Essa inoltre può aggiungere nuovi dati e metodi ma non modificare quelli già esistenti. Ho anche utilizzato l’astrazione, per eredità, per creare il DrawPad da SimpleDrawPad. II PARTE: Con questo progetto ho acquisito il concetto di “classi astratte” ed ho imparato ad implementarne i metodi, per esempio ho utilizzato la parola “super” per invocare un costruttore della classe base Shape.