PDA

Visualizza versione completa : [Java] Esercizio Telefonino


Alhazred
05-03-2004, 21.44.29
Devo svolgere questo esercizio:
Si vuole realizzare un sistema per la composizione dei messaggi da inviare tramite telefonino. Ad ogni messaggio corrisponde un codice. Ad esempio al codice "ta" corrisponde il messaggio completo "ti amo, amore.". Definire la classe TestoMessaggio per la gestione dei messaggi. La classe deve avere un metodo per creare oggetti TestoMessaggio leggendo il codice e il messaggio completo da tastiera, un metodo per restituire il codice ed un metodo per restituire il testo del messaggio.
Per questa prima parte di classe va bene questa.

class TestoMessaggio{
private String code;
private String mex;
public TestoMessaggio(String code, String mex){
this.code= code;
this.mex = mex;
}
public string getCode(){
return code;
}
public string getMex(){
return mex;
}
}


Prosegue così:
Un messaggio deve contenere il numero da chiamare, il mittente ed il testo del messaggio. Definire una classe Messaggio, con:

1) un metodo che crea un'istanza a partire da un oggetto di classe TestoMessaggio e 2 stringhe che rappresentano il numero di tel. del mittente e destinatario

2) un metodo che crea un'istanza a partire da un oggetto di classe TestoMessaggio ed una stringa che rappresenta il numero di telefono del mittente

3) un metodo che crea un'istanza a partire da un oggetto di classe TestoMessaggio

4) un metodo che riceve come parametro il numero di telefono del destinatario ed aggiorna il destinatario del messaggio

5) un metodo per la stampa del messaggio

Ho pensato a questa classe:

public class Messaggio extends TestoMessaggio {
public Messaggio(String code, String mex, String mitt, String dest) {
super(code, mex);
String numMitt = mitt;
String numDest = dest;
}
public Messaggio(String code, String mex, String mitt) {
super(code, mex);
String numMitt = mitt;
}
public Messaggio(String code, String mex) {
super(code, mex);
}
public void modificaDest(String numDest) {
***********************************
}
public void stampaMessaggio(Messaggio m) {
System.out.println(m.getMex());
}
}


Dove ci sono gli asterischi ci andrebbe il metodo che cambia il numero del destinatario, ma come lo faccio? Devo scrivere anche un metodo che restituisca il numero oppure c'è un altro modo per sostituirlo?

Dav82
06-03-2004, 00.20.59
Prima osservazione:

nel primo dei costruttori che hai messo, dopo la chiamata a super() che è corretta, fai due assegnamenti: a cosa? :)
numMitt e numDest dovranno essere delle variabili della classe Messaggio ;)
E questa è anche la risposta al tuo dubbio...


public void modificaDest(String numDest) {
***********************************
}


quello che devi mettere nel metodo è il codice che modifica il valore di numDest, niente più. Prova a vedere la mia risposta sull'uso di this nell'altro thread, e ragionaci ;) Non devi restituire niente poi, quello è solo un metodo che, come da specifica, imposta il valore di qualcosa: è un metodo detto "modifier", in contrapposizione ai metodi "listener" *** (no, si chiamano in un altro modo... ora non ricordo) che invece prendono qualche informazione dalla classe.

Un altro appunto: in stampaMessaggio tu passi il messaggio stesso... non ha senso. Tu chiami quel metodo su un certo oggetto messaggio, a cui hai appunto il riferimento, che ti restituisce il testo del messaggio stesso. E nel corpo del metodo, non devi usare un metodo della classe Messaggio stessa, ricorda sempre "this" (certo, puoi benissimo usarlo, nessuno lo vieta ma... non è propriamente la cosa migliore da fare ;)).

Buon lavoro! :)


*** EDIT: ecco, ho ricordato, si chiamano "Observer", perchè appunto osservano qualche cosa della classe: il getMex, per esempio, è observer perchè restituisce un qualche cosa della classe, cioè il messaggio.

Alhazred
06-03-2004, 11.25.53
Originariamente inviato da Dav82
...
quello che devi mettere nel metodo è il codice che modifica il valore di numDest, niente più.
...
Credo così di aver risolto:

public void modificaDest(String numDest) {
String nuovoDest = JOptionPane.showInputDialog("Inserisci il nuovo destinatario");
this.numDest = nuovoDest;

Non ho potuto verificare perché non riesco a scrivere una riga che mi scriva il numero del destinatario :S
Ho provato con una cosa di questo tipo:

import javax.swing.JOptionPane;
public class Cliente {
String numero;
public static String leggiNumero() {
String numero = JOptionPane.showInputDialog("Inserisci il numero del destinatario");
return numero;
}
public void main (String[] args) {
String numMitt = "3973186876";
String numero = leggiNumero();
Messaggio m1 = new Messaggio("cs","Come stai?",numMitt,numero);
System.out.println(this.numero);
String nuovoDest = JOptionPane.showInputDialog("Inserisci il nuovo destinatario");
modificaDest(nuovoDest);
System.out.println(this.numero);
}
}
Ottengo un errore nella chiamata a modificaDest:
" cannot resolve symbol
symbol : method modificaDest (java.lang.String)"

Togliendo la chiamata e ricompilando va tutto bene, però in esecuzione mi si presenta un altro errore:
"Exception in thread "main": Java.lang.NoSuchMethodError: main"

Dav82
06-03-2004, 13.32.10
Ovviamente ti dice che non trova nessun metodo modificaDest(): infatti lui lo cerca nella classe Cliente, è come se prima di modificaDest(nuovoDest) ci fosse un this, in pratica tu chiami this.modificaDest(nuovoDest) che non esiste. Tu dovresti chiamare m1.modificaDest(nuovoDest), perchè è il Messaggio che ha quel metodo, non il Cliente.
La seconda println di numero è uguale alla prima, perchè tu non modifichi la variabile numero nella classe Cliente fra una println e l'altra.
Non capisco invece l'eccezione nel thread main, tu il main ce l'hai... boh!

Un appunto sulla costruzione delle classi: in Cliente tu fai in modo di salvare in un attributo della classe il numero del destinatario, ma questo numero è proprio del messaggio, non del Cliente. Dovresti invece tenere come attributo della classe Cliente il numero del mittente, questo sì: lo fai in parte, scrivendo nel main String numMitt = "3973186876": così facendo però l'informazione non è persistente, in sostanza numMitt è una variabile allocata nel main, non è una vera e propria variabile della classe. Ti faccio un esempio.
Se tu dal main chiamassi un metodo che serve al Cliente per impostare il proprio numero, una cosa così insomma:


public static void main (String[] args){

// tutto il resto...

impostaNumMitt();

// tutto il resto...


private void impostaNumMitt(){

String buffer = JOptionPane.showInputDialog("Imposta num:");
numMitt = buffer;
}
}


non potresti farlo, perchè nel metodo impostaNumMitt tu fai riferimento a numMitt, che è dichiarata nel main, e non è una variabile di classe: in sostanza, nel metodo non la puoi vedere! ;)

Alhazred
06-03-2004, 16.55.30
Originariamente inviato da Dav82
...
scrivendo nel main String numMitt = "3973186876": così facendo però l'informazione non è persistente, in sostanza numMitt è una variabile allocata nel main, non è una vera e propria variabile della classe.
...
Questo l'ho fatto perché mi interessa vedere solo se i metodi richiesti dall'esercizio funzionano.

A forza di tentativi ci sono quasi, la classe Cliente l'ho fatta diventare così:

import javax.swing.JOptionPane;
public class Cliente {
String numero;
public static String leggiNumero() {
String numero = JOptionPane.showInputDialog("Inserisci il numero del destinatario");
return numero;
}
public static void main (String[] args) {
String numMitt = "3973186876";
String numero = leggiNumero();
Messaggio m1 = new Messaggio("cs","Come stai?",numMitt,numero);
System.out.println(m1.numDest);
String nuovoDest = JOptionPane.showInputDialog("Inserisci il nuovo destinatario");
m1.modificaDest(nuovoDest);
System.out.println(m1.numDest);
}
}

adesso funziona tutto tranne per il fatto che il primo println mi restituisce sempre null.

Alhazred
06-03-2004, 17.18.34
Ho risolto, stavolta il problema era nella classe Messaggio, iniziava così:

public class Messaggio extends TestoMessaggio {
String numMitt;
String numDest;
public Messaggio(String code, String mex, String mitt, String dest) {
super(code, mex);
String numMitt = mitt;
String numDest = dest;
}
.....

ora l'ho cambiata in questo modo e funziona

public class Messaggio extends TestoMessaggio {
String numMitt;
String numDest;
public Messaggio(String code, String mex, String mitt, String dest) {
super(code, mex);
this.numMitt = mitt;
this.numDest = dest;
}
......


L'eccezione era dovuta al fatto che main l'avevo dichiarato non-static.

Alhazred
06-03-2004, 17.20.21
Grazie dell'aiuto Dav ;)
tanto avrò ancora bisogno di fare altre domande, questo esercizio continua... ma non oggi, adesso basta :)

Dav82
06-03-2004, 17.25.27
Urca urca, non avevo fatto caso ad una cosa!!!! E questa cosa sta più o meno alla base di tutta la programmazione ad oggetti.

Tu in cliente fai la print passando come parametro m1.numDest: così facendo accedi dalla classe Utente ad un attributo della classe Messaggio. In generale questo non è assolutamente consigliabile, perchè in questo modo potresti anche direttamente fare, sempre dalla classe Utente, m1.numDest = "quello che vuoi tu".
In Messaggio gli attributi devono essere private, così possono essere toccati solo dall'interno della classe messaggio stessa ;)

Public e private funzionano per gli attributi come per i metodi.

Ci sono poi anche altri tipi di visibilità oltre a public e private: sono "friendly", "protected" e "package" : non mi ricordo mai bene come sono, anzi due sono la stessa cosa... se vuoi guarda sul manuale ;)

Ciao :)

Alhazred
06-03-2004, 17.30.38
Originariamente inviato da Dav82
...
In generale questo non è assolutamente consigliabile, perchè in questo modo potresti anche direttamente fare, sempre dalla classe Utente, m1.numDest = "quello che vuoi tu".
In Messaggio gli attributi devono essere private, così possono essere toccati solo dall'interno della classe messaggio stessa ;)
...

Mi era già venuto in mente ripensando alla tua risposta nell'altro 3d, infatti ho modificato il tutto usando in cliente il metodo getDest() della classe Messaggio ;)
Grazie ancora.

Dav82
06-03-2004, 17.33.02
Di niente, figurati ;)