Definire una classe AgentID le cui istanze contengono il seguente campo:
Definire poi una classe MessageType che permette di specificare il tipo di messaggio creato (REQUEST, INFORM, REFUSE, QUERY-IF, QUERY-REF, AGREE, FAILURE, NOT-UNDERSTOOD, ecc.) contenente la dichiarazione di un inseme di costanti, una per ogni tipo di messaggio (nota, in Java non esistono costanti, come realizzare qualcosa di simile?).
Si definisca un vettore (privato? pubblico? statico? non statico?) contenente per ogni tipo di messaggio definito la corrispondente nome in formato di stringa, facendo corrispondere il valore numerico con la posizione nel vettore stesso per una più facile estrazione. La classe deve contenere il seguente metodo:
public String getTypeName(int i)che restituisce il corrispondente nome del tipo possato come parametro. Nel caso che il valore del parametro sia fuori del range degli indici del vettore definito sopra si restituisca "UNKNOWN".
Definire poi una classe astratta Message contenente i seguenti campi:
Per ogni classe (anche per la classe MessageType?) si definiscano gli opportuni costruttori. Si definiscano poi un metodo di tipo ``get'' ed uno di tipo ``set'', per ogni campo presente nelle classi AgentID e Message (e nelle classi che scriveremo in seguito!); ad esempio, per il campo sender della classe Message:
Si definisca, per ogni classe introdotta (anche per la classe MessageType?) e che introdurremo in futuro, il metodo
public String toString()che restituisce una stringa che rappresenta l'oggetto stesso in formato stampabile su console. Ad esempio, se messaggio è una variabile che contiente un riferimento ad un oggetto di tipo Message4You, allora messaggio.toString() restituisce una stringa che stampata dovrebbe risultare qualcosa del tipo:
Type: REQUEST Sender: (orologio_atomico_GFerraris, time_provider) Receiver: (Aldo, time_requester) Content: Che ora e'? ExtraArgument: 21:35Inoltre si definisca per la classe AgentID il metodo
public boolean equals(AgentID agentID)che restituisce true se l'identificatore dell'agente passato come parametro ha lo stesso nome e appartiene alla stessa categoria dell'oggetto su cui è invocato il metodo, false altrimenti.
Si ricordi di scegliere (sapendo giustificarne il motivo) il tipo di visibilità (private? protected? public? default?) per ogni campo, metodo e classe.
Definire tre ulteriori classi che estendono la classe Message: Message4You, Message4Some e Message4All. La prima definisce un messaggio per uno specificato receiver, la seconda definisce un messaggio i cui destinatari sono tutti gli agenti presente nel framefork in un dato momento appartenenti ad una specifica categoria, la terza definisce un messaggio i cui destinatari sono tutti gli agenti presenti nel framework in un dato momento. Suggerimento: si usi un oggetto di tipo AgentID con name a null per rappresentare una categoria, e un oggetto di tipo AgentID con entrambi i suoi campi a null per rappresentare tutti i destinatari. Si verifichi che il metodo equal e toString in Messaggio siano definiti ancora in maniera corretta o non sia necessario ridefinirli nelle sottoclassi.
Infine si definisca una classe ProvaMessaggio contenente un metodo main che effettui il test delle classi precedentemente definite.
baldoni 2005-01-13