Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 1, 9 CFU => Topic started by: Blonic on 27-01-2009, 22:00:59



Title: Aiuto! Esercizio di laboratorio!!!
Post by: Blonic on 27-01-2009, 22:00:59
Vi ringrazio in anticipo per l'aiuto... posto il codice dell'esercizio svolto da me (le classi A, B, C, D si trovano in altri file, tutte ben funzionanti):
Code:
import java.util.*;

public class Laboratorio
{
public static void main (String[] args)
{
int i;
Random r = new Random (6353433);
A [] vett = new A [100];
for (i=0; i<vett.length; i++)
{
int x = r.nextInt(10);
int y = r.nextInt(100);
int z = r.nextInt(30);
if (r.nextInt(2)==1) vett[i] = new B(x, y, z);
else vett[i] = new C(x, y, z);
}

D [] d = new D [vett.length];
int Sommaf = 0, Sommafobj = 0, istanzediB = 0;
i=0;

while (i<vett.length)
{
Sommaf += vett[i].f();

d[i] = new D(r.nextInt(47));

Sommafobj += vett[i].f(d[i]);

if ((vett[i] instanceof B) && (!(vett[i] instanceof C)))
istanzediB ++;

i++;
}

System.out.println("Risultati :" + Sommaf +",\t"+ Sommafobj+",\t"+ istanzediB);
}
}

Ora puntiamo l'attenzione sulla stringa maledetta:
Code:
Sommafobj += vett[i].f(d[i]);

Questo è il messaggio d'errore al riguardo:
Code:
>javac Laboratorio.java
Laboratorio.java:29: f() in A cannot be applied to (D)
Sommafobj += vett[i].f(d[i]);
                    ^
Laboratorio.java:29: inconvertible types
found   : <nulltype>
required: int
Sommafobj += vett[i].f(d[i]);
                      ^
2 errors
>Exit code: 1

Per me è tutto ok!!! Cosa ha che non và!?!?


Title: Re:Aiuto! Esercizio di laboratorio!!!
Post by: MIC on 27-01-2009, 23:10:03
fai un cast a B e vedi che funziona .wink

io personalmente quel punto l'ho fatto così:
Code:
int sumF=0;
for(int i=0; i<vett.length; i++)
{
D obj=new D(r.nextInt(47));
sumF+=((B)vett[i]).f(obj);
}



Title: Re:Aiuto! Esercizio di laboratorio!!!
Post by: Blonic on 28-01-2009, 15:52:00
Non ha molto senso questa cosa secondo me... se faccio il cast non mi cambia anche i metodi? oppure sbaglio?


Title: Re:Aiuto! Esercizio di laboratorio!!!
Post by: Vivynz on 28-01-2009, 16:07:21
in che senso cambia i metodi?il metodo f(obj) si trova solamente nella classe B quindi per poterlo invocare da un riferimento alla superclasse bisogna fare il casting così come ha scritto MIC..


Title: Re:Aiuto! Esercizio di laboratorio!!!
Post by: Blonic on 28-01-2009, 16:15:50
No, il metodo viene ereditato anche da c, dico bene?
Il problema (secondo me) è che se castiamo cambiamo il contenuto dei metodi, cioè tutti gli vett[ i ] farebbero quello che è scritto in B, e non in C.
Non se sono sicuro, è un'ipotesi...

Qualche luminare ci illumini per favore!!!

EDIT:
Ho fatto il cast, ora la stinga è questa:
Code:
Sommafobj += ((B)(vett[i])).f(d[i]);
e mi funziona.... però non capisco perchè fare questo cast.... qualcuno può illuminare il mio buio?


Title: Re:Aiuto! Esercizio di laboratorio!!!
Post by: andreacannella on 29-01-2009, 16:38:44
Caro collega, il casting va fatto in quanto l'array che ti sei creato con il codice fornito nel testo della prova è un array di oggetti di classe A.
Il metodo f con parametri è previsto SOLTANTO per oggetti di classe B. Eccoti spiegato il motivo del casting a B.
Spero di averti "illuminato"...
:D:D

Buona giornata

 :-ciao :-ciao


Title: Re:Aiuto! Esercizio di laboratorio!!!
Post by: Blonic on 29-01-2009, 18:45:17
Ho compreso... ma in parte!
C non è l'estenzione di B? Quindi non dovrebbe aver ereditato anche lui quel metodo?


Title: Re:Aiuto! Esercizio di laboratorio!!!
Post by: andreacannella on 29-01-2009, 18:49:13
Il vettore è dichiarato di oggetti di classe A, quindi non può avere il metodo di cui stiamo parlando.
Se fosse stato un vettore di C avresti avuto ragione...


Title: Re:Aiuto! Esercizio di laboratorio!!!
Post by: Blonic on 29-01-2009, 19:00:07
mmm ancora non comprendo... L'array è di A, ma ogni ogni elemento dell'array non assegniamo un B o un C?
O forse ogni elemento è un A che fà riferimento ad un B o un C?

........ LUCEE!!! LUCEEEE!!! :[Emoticon] Asd:


Title: Re:Aiuto! Esercizio di laboratorio!!!
Post by: Vivynz on 29-01-2009, 19:01:47
Essendo l'array di A i riferimenti sono di classe A anche se puntano ad oggetti di classe B o C...


Title: Re:Aiuto! Esercizio di laboratorio!!!
Post by: andreacannella on 29-01-2009, 19:15:49
Brava Viviana!
Finalmente una che ha compreso quello che volevo dire a StaiZitto...


Title: Re:Aiuto! Esercizio di laboratorio!!!
Post by: Vivynz on 29-01-2009, 19:19:46
Bè ho cercato di spiegarglielo anch'io...speriamo che adesso sia chiaro  .smile


Title: Re:Aiuto! Esercizio di laboratorio!!!
Post by: andreacannella on 29-01-2009, 19:31:27
Non credo.....:D ma quantomeno non scriverà più...
:D:D
asd


Title: Re:Aiuto! Esercizio di laboratorio!!!
Post by: Vivynz on 29-01-2009, 19:38:45
 :[Emoticon] Asd:
No dai è giusto che si chiarisce i dubbi... .smile


Title: Re:Aiuto! Esercizio di laboratorio!!!
Post by: Blonic on 29-01-2009, 20:58:18
Non credo.....:D ma quantomeno non scriverà più...
:D:D
asd

Mi dispiace, non è così facile zittirmi! XD
Non ho ancora capito al 100%, vabbè mi limiterò a credere in fede e a rileggere 21342352 di volte gli appunti per capire.
Bye bye e grazie!


Title: Re:Aiuto! Esercizio di laboratorio!!!
Post by: Vivynz on 29-01-2009, 21:09:16
e meno male che ti chiami Stai Zitto! :[Emoticon] Asd: :[Emoticon] Asd: :[Emoticon] Asd:
cmq prego spero che almeno un pochino siamo stati d'aiuto  .smile