PDA

View Full Version : [Java] Problemino con interfaccia


Sally Brown
13-07-2007, 16:14
Ciao a tutti :) ,
scusatemi se non sarò molto chiara ma è la prima volta che scrivo in questo forum e sono una VERA principiante di Java :flower:.
Premesso questo vorrei chiedere un piccolo aiuto riguardante un progetto.
Il testo del progetto è il seguente:

L'obiettivo del progettino è implementare una piccola agenda elettronica in Java.
Un'agenda contiene un insieme di appuntamenti. Un appuntamento è composto da una data, un oggetto ed una persona. Una data è composta da un'ora, una durata ed un giorno. Un oggetto è composto da una stringa descrittiva e da un grado d'importanza (importantissimo, normale, non necessario). Una persona è composta da un nome ed un cognome.

Definire le classi Agenda, Appuntamento, Data, Durata, Giorno, Grado, Mese, Oggetto, Persona.

Definire nella classe Agenda:

* un metodo aggiunge che permette di aggiungere un appuntamento. Se la data dell'appuntamento e la sua durata si sovrappongono con un appuntamento già nell'agenda, si solleva l'eccezione ComandoNonValido.
* un metodo elimina che permette di rimuovere un appuntamento. Se l'appuntamento non esiste nell'agenda, si solleva l'eccezione ComandoNonValido.
* un metodo appuntamenti che restituisce l'array di tutti gli appuntamenti dell'agenda.
* un metodo stampa che stampa tutti gli appuntamenti dell'agenda.

L'interfaccia Filtro contiene due metodi che permettono, rispettivamente, di selezionare ed ordinare gli appuntamenti.

interface Filtro {
boolean valido(Appuntamento ap);
boolean maggiore(Appuntamento ap, Appuntamento ap);
}

Sovraccaricare i metodi appuntamenti e stampa della classe Agenda per accettare come parametro un oggetto che implementa l'interfaccia Filtro, permettendo cosí di restituire (o stampare) in ordine solamente gli appuntamenti validi.

Definire due filtri che permettono di avere

* tutti gli appuntamenti fissati tra una data ed un'altra in ordine cronologico inverso,
* tutti gli appuntamenti con una persona in ordine d'importanza.


Ho creato tutte le classi, il problema è arrivato nel momento in cui devo sovraccaricare i metodi stampa() e appuntamenti() della classe Agenda perchè...non ho proprio capito come si fa :confused: .

Grazie mille per l'aiuto

andbin
13-07-2007, 16:35
Nella classe Agenda inizialmente hai quindi:

public Appuntamento[] appuntamenti () { .... }
e
public void stampa () { .... }

(o qualcosa del genere ... non ho capito se devi usare proprio un array o una collezione come ad esempio ArrayList)

Ti viene chiesto di fare l'overload di questi metodi in modo da poter fare queste due operazioni potendo però specificare un oggetto di tipo Filtro.

Quindi devi aggiungere altri 2 metodi del tipo:

public Appuntamento[] appuntamenti (Filtro f) { .... }
e
public void stampa (Filtro f) { .... }

In cui non prenderai più in considerazione tutti gli appuntamenti, ma solo quelli che soddisfano i requisiti dettati dall'oggetto Filtro.

Ti è anche stato chiesto di creare 2 classi che implementano l'interfaccia Filtro e che effettuano un filtro come specificato nel testo.


P.S.: parlando del design, trovo esagerato dover definire una classe per Giorno, Durata e Mese. Grado invece potrebbe essere fatta come enum. Ma queste sono mie opinioni .....

Sally Brown
13-07-2007, 16:48
grazie per la risposta, il mio problema è che non ho proprio idea di come si fa a sovraccaricare i metodi, ho cercato in diversi manuali ma non ho trovato nulla. Comunque molte grazie per l'aiuto :)

andbin
13-07-2007, 16:56
grazie per la risposta, il mio problema è che non ho proprio idea di come si fa a sovraccaricare i metodiMa è appunto quello che ho detto. Creare altri 2 metodi che hanno lo stesso nome dei primi due ma con parametri diversi, nel tuo caso con un parametro di tipo Filtro. Questo è l'overload: avere due o più metodi con lo stesso nome ma con parametri diversi.

Se non vuoi dover duplicare il codice c'è anche una soluzione elegante. Creare un filtro "fittizio" che accetta tutto.

Ad esempio mettendolo in un campo static e private:
static private Filtro tutti = new Filtro () {
boolean valido(Appuntamento ap) { return true; }
boolean maggiore(Appuntamento ap, Appuntamento ap) { return true; }
};

E poi fare in modo da "esprimere" i metodi senza Filtro esplicito come chiamate ai metodi che hanno il Filtro esplicito passando il filtro 'tutti'.

Sally Brown
13-07-2007, 17:06
So cosa significa sovraccaricare un metodo (mi sono espressa male), il problema è che non so come implementare praticamente l'interfaccia nelle classi Data, Persona e Grado.
Non so proprio cosa devo scrivere, il mio prof ci ha solo detto cosa sono le interfacce, ma senza esempi.

andbin
13-07-2007, 17:15
So cosa significa sovraccaricare un metodo (mi sono espressa male)Ok, scusa per la precisazione.

il problema è che non so come implementare praticamente l'interfaccia nelle classi Data, Persona e Grado.L'interfaccia Filtro non la devi implementare in queste classi!
Devi creare poi 2 nuove classi, ad esempio:

class FiltroPeriodoInverso implements Filtro {
private Data d1;
private Data d2;

public FiltroPeriodoInverso (Data d1, Data d2) {
....
}

boolean valido(Appuntamento ap) { ..... }
boolean maggiore(Appuntamento ap, Appuntamento ap) { ..... }
}e poi un'altra per fare l'altro filtro:
class FiltroPersonaImportanza implements Filtro {
....
....
}

Sally Brown
13-07-2007, 17:20
Aiuto!!! :help:
Troppo difficile!!!

Grazie mille per la tua disponibilità, cercherò di fare qualcosa!!! tipo :muro: finchè non mi viene in mente come fare.

Scusami ancora tanto per averti disturbato

andbin
13-07-2007, 17:29
Aiuto!!! :help:
Troppo difficile!!!

Grazie mille per la tua disponibilitàPrego, figurati. Ma se hai dubbi, chiedi pure. Non è così difficile come credi.

Prendiamo in considerazione le versioni di appuntamenti() e stampa() che ricevono esplicitamente un Filtro. Tutto quello che farai cioè creare un array di appuntamenti o stampare gli appuntamenti la dovrai fare "interpellando" il filtro passato. Dovrai quindi chiamare i metodi di Filtro per sapere che cosa fare, se accettare l'appuntamento e come ordinarli tra di loro.

È chiaro che quando dovrai chiamare questi due metodi, dovrai passare una istanza di una qualche classe che implementa Filtro. E sono appunto le due classi di cui ho fatto l'esempio (basandomi sul testo dell'esercizio).

Più chiaro adesso?

redcloud
13-07-2007, 18:58
Ancora con sti trucchi di usare nomi femminili per velocizzare le risposte?

Sally Brown
14-07-2007, 09:59
Ancora con sti trucchi di usare nomi femminili per velocizzare le risposte?

Sono una ragazza...libero di non crederci :)

redcloud
14-07-2007, 10:05
Beh allora... FOTO! :sofico:

Sally Brown
14-07-2007, 12:22
Non sono tanto stupida da mettere la mia foto, però tutti gli aiuti sono sempre ben accetti