Problemi per la lezione del 14/1
- [Eccezioni in Orario (I)] Modificate il costruttore della classe Orario in modo che sollevi una IllegalArgumentException (che è un'eccezione non controllata) se il numero di minuti non è compreso fra 0 e 59, o il numero di ore non è compreso fra 0 e 23. Come potrete verificare, tutto il progetto continua a compilare (perché?). Provate di nuovo la classe Orario usando un main che provochi l'eccezione.
- [Eccezioni in Orario (II)] Create una classe di eccezione controllata di nome OrarioIllegaleException e fate sollevare al costruttore di Orario un'eccezione di questo tipo anziché una IllegalArgumentException, creandola con un messaggio opportuno che spieghi se sono sbagliate le ore o i minuti. Modificate la parte restante del codice del progetto in modo che compili e provate di nuovo la classe.
- [Implementazione del metodo equals] La classe Orario ha un metodo equals
con la seguente segnatura:
public boolean equals(Orario x)Provate a creare una Sequenza e inseritevi degli orari. Quindi, create un nuovo oggetto di classe orario che sia identico (stesse ore, stessi minuti) a un oggetto presente nella sequenza, e testate l'appartenenza (usando il metodo contains), verificando che l'effetto non è quello atteso.
Il motivo per cui il metodo che abbiamo scritto non funziona quando viene usato dalla classe Sequenza è il seguente: il metodo equals ereditato da Object (e usato da tutte le classi che hanno bisogno di stabilire se due oggetti sono uguali oppure no) ha la seguente segnatura
public boolean equals(Object x)
Il metodo che avete scritto, avendo una segnatura diversa, non riscrive il metodo di Object, ma viene interpretato come un metodo aggiunto. Per ottenere l'effetto desiderato dovete per forza riscrivere anche il metodo di Object (con la sua segnatura). Prima di farlo, cambiate il nome del metodo equals e chiamatelo stessoOrario; quindi scrivete il metodo equals usando la segnatura che ha in Object. Il metodo deve procedere come segue: se x non è istanza di Orario, deve restituire false (un orario non è mai equivalente a una cosa che non sia un orario); in caso contrario, deve invocare il metodo stessoOrario.
Provate a farlo, e verificate che ora il precedente esperimento con la sequenza funziona. Nota: avreste potuto evitare di cambiare nome al vostro metodo equals, e limitarvi ad avere due metodi di nome equals con segnature diverse in cui uno dei due (quello che riscrive il metodo di Object) invoca l'altro (usando un casting).
- [Metodo equals nella classe Persona] Aggiungete un metodo equals alla classe
Persona, postulando che due persone debbano essere considerate uguali se hanno lo stesso nome e lo stesso cognome.
Verificate che il metodo funzioni, usando nuovamente il trucco della creazione di una sequenza e dell'uso del metodo contains.
Il metodo continua a funzionare se create una sequenza di abbonati, e cercate un abbonato (poiché la classe Abbonato eredita il metodo equals da Persona): verificatelo.
Cosa succede invece se create una sequenza che contiene sia abbonati che persone? Perché?
- [Classe ElencoAbbonati] Leggete la documentazione relativa al metodo find di Sequenza
e tentate di capire come usare questo metodo per cercare un abbonato in una sequenza contenente degli abbonati (dati solo il suo
nome e cognome): per aiutarvi, scrivete un semplice metodo main. Una volta capito il funzionamento, scrivete una classe ElencoAbbonati
che contenga almeno i seguenti metodi:
- ElencoAbbonati(): crea un elenco abbonati vuoto;
- void add(Abbonato x): aggiunge l'abbonato x all'elenco;
- String toString(): restituisce l'elenco degli abbonati presenti (in forma stampabile);
- boolean contains(Abbonato x): guarda se l'abbonato x è presente nell'elenco;
- Abbonato cerca(String nome,String cognome): cerca l'abbonato di nome/cognome dati (restituisce null se l'abbonato non è presente);
- int ricavoTotale(): restituisce la somma delle spese totali delle bollette degli abbonati presenti nell'elenco (che rappresenta, ovviamente, il ricavo totale di TeleBue).
- [Classe Retta] Definite una classe di nome Retta in un pacchetto di nome
it.unimi.mat.geometria, le cui istanze rappresentano rette nel piano cartesiano. Devono essere consentite rette qualsiasi
(anche parallele all'asse Y). Poiché la classe Retta usa fra l'altro dei punti, mettete nel pacchetto una copia
della classe Punto (che avete scritto alcune lezioni fa).
La classe deve fornire almeno i seguenti costruttori e metodi:
- Retta(): costruisce la bisettrice del I/III quadrante;
- Retta(double m, double q): costruisce la retta y=mx+q;
- Retta(double x): costruisce la retta parallela all'asse y e passante per (x,0);
- Retta(Retta r, Punto p): costruisce la retta parallela a r e passante per p;
- Retta(Punto p, Retta r): costruisce la retta perpendicolare a r e passante per p;
- double y(double x): restituisce il valore y tale che (x,y) sta sulla retta (e solleva un'eccezione se la retta è verticale);
- boolean isParallela(Retta r): restituisce true sse la retta è parallela a r;
- boolean isPerpendicolare(Retta r): restituisce true sse la retta è perpendicolare a r;
- boolean equals(Object x): restituisce true sse la retta è uguale a x.
- boolean passaPer(Punto p): restituisce true sse la retta passa per p.