Implementazione di classi

  1. Dopo essersi assicurati che il file .jar (o i suoi contenuti) utilizzato durante l'ultima lezione non sia automaticamente inserito nel classpath, scrivere la classe Rectangle, inserendovi due variabili di istanza (altezza e larghezza), un costruttore (avendo cura di dare ai suoi parametri nomi formali diversi da quelli delle variabili di istanza) e i metodi accessori che permettono di leggere e scrivere il valore delle variabili di istanza, oltre a un'implementazione ragionevole di draw(), calculateArea() e calculatePerimeter(). Verificare che le variabili di istanza non abbiano visibilità esterna alla classe e che i nomi e le segnature dei metodi siano coerenti con l'utilizzo finora fatto della medesima classe.
  2. Verificare che la classe Rectangle realizzata al punto precedente può essere utilizzata unitamente alle classi scritte durante l'ultima lezione.
  3. Aggiungete al costruttore di Rectangle la stampa a video di un opportuno messaggio e verificare che questo venga effettivamente emesso ogni volta si utilizza new per creare istanze della classe. Eliminare successivamente la stampa di tale messaggio dal corpo del costruttore.
  4. Che cosa succede se si tenta di accedere alle variabili di istanza di un oggetto di Rectangle senza utilizzare i corrispondenti metodi accessori?
  5. Aggiungere alla classe Rectangle un'implementazione ragionevole del metodo toString() e verificare che questo viene implicitamente invocato quando si stampano le istanze della classe e più in generale ogni qual volta un'istanza di Rectangle occorre in un'espressione al posto di una stringa.
  6. Verificare che il comportamento della classe Rectangle rimane inalterato se i parametri formali del costruttore hanno lo stesso nome delle variabili di istanza, a patto di usare opportunamente la parola chiave this.
  7. Verificare che è possibile utilizzare la classe Rectangle ottenuta al punto precedente per risolvere il problema di determinare il rettangolo avente area minima all'interno di una successione di rettangoli (è lasciata piena autonomia relativamente alle modalità con cui la sequenza viene fornita al programma).
  8. Creare la classe Square estendendo la classe Rectangle, facendo in modo che il costruttore della sottoclasse invochi quello della superclasse e modificando il minor numero di metodi possibili. Testare il comportamento della classe invocando il suo costruttore e tutti i suoi metodi.
  9. Creare la classe Circle, procedendo nello stesso modo utilizzato per Rectangle, testando come per Square il corretto funzionamento del codice prodotto.
  10. Creare la classe astratta Shape inserendovi i metodi astratti calculateArea(), calculatePerimeter() e draw(). Verificare che non risulta possibile creare istanze di questa classe.
  11. Modificare il codice finora scritto per fare in modo che tutte le classi realizzate estendano Shape. È necessario che tale estensione sia dichiarata esplicitamente per tutte le classi?
  12. Fare in modo che tutte le classi realizzate implementino l'interfaccia Comparable così che il confronto tra due istanze venga fatto in base all'area. Valutare la differenza tra l'approccio che richiede l'implementazione dell'interfaccia nelle singole classi e quello che effettua l'implementazione nella sola classe Shape, al fine di determinare quale dei due risulti più efficiente.
  13. Verificare che risulta possibile confrontare due istanze di Shape invocando esplicitamente compareTo su una di esse, specificando l'altra come argomento.
  14. Verificare che è possibile utilizzare la classe Arrays per ordinare un array polimorfo di istanze di Shape.
  15. In realtà l'interfaccia Comparable è basata su un tipo generico (come indicato nelle API), che essenzialmente rappresenta la classe le cui istanze si vogliono confrontare. Modificare l'implementazione di Comparable in modo che si basi su un opportuno tipo generico. Verificare che anche avendo implementato questa modifica risulta comunque possibile utilizzare la classe Arrays per ordinare array di oggetti derivati da Shape.
  16. Leggere nelle API la documentazione dell'interfaccia java.util.Comparator. Questa interfaccia permette di implementare diverse strategie di ordinamento per oggetti di una data classe, in quanto risulta possibile invocare il metodo sort della classe Arrays specificando come secondo argomento proprio un'istanza di una classe che implementa Comparator. Creare una classe che implementa l'interfaccia Comparator (scegliendo opportunamente il corrispondente tipo generico) in modo da poterla utilizzare per confrontare istanze di Shape sulla base del loro perimetro. Verificare il funzionamento di tale classe ordinando una sequenza di oggetti di Shape per perimetro crescente.
  17. Ordinare una sequenza di oggetti di Shape per perimetro decrescente, senza modificare il codice della classe Shape o di sue sottoclassi.
  18. Scrivere la classe Triangle che estende la classe Shape e che descrive i triangoli, utilizzando come variabili di istanza le lunghezze dei tre lati. Tenete presente che per implementare calculateArea() è possibile utilizzare la formula di Erone. Il metodo main di questa classe deve verificare il corretto funzionamento delle operazioni di cui Triangle risulta dotata (ergo, la creazione di sue istanze e almeno un'invocazione per ogni metodo implementato o ereditato).
  19. Realizzare la classe CorpoCeleste, contenente Realizzare poi la classe CentroControllo, contenente Attenzione: non è richiesto di gestire in modo particolare la terminazione della sequenza di input. Teoricamente il programma può continuare indefinitamente la sua esecuzione.
  20. Modificare le classi dell'esercizio preceente in modo che quando l'utente inserisce 0 come valore sia per la massa sia per la distanza il programma termini la sua esecuzione.
  21. Realizzare la classe RightTriangle, le cui istanze sono triangoli rettangoli, estendendo opportunamente la classe Rectangle. In questo caso il triangolo sarà rappesentato in termini di base e altezza, quindi i tre lati vanno ricavati da queste informazioni per poter calcolare il perimetro, tenendo conto del teorema di Pitagora.