Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 1, 9 CFU => Topic started by: crypt0 on 25-02-2010, 15:46:32



Title: Accesso a variabili appartenenti ad una sottoclasse
Post by: crypt0 on 25-02-2010, 15:46:32
Salve.

Temo di aver fatto due errori che potrebbero aver compromesso l'esito positivo della terza parte di oggi.

La mia domanda è:
Data una gerarchia A<--B<--C, ho in C una variabile di istanza public (che chiamo x) non presente nella superclasse A.

Inizializzo un vettore di elementi A che istanzio scegliendo casualmente tra B e C.

Posso accedere ad x scrivendo semplicemente A.x oppure è essenziale il casting?


Title: Re:Accesso a variabili appartenenti ad una sottoclasse
Post by: R3m on 25-02-2010, 15:54:12
Nell'array ci sono n elementi di B e C..se tenti di accedere a B.x o a C.x, nel caso in cui l'indice dell'array trovi C sei a posto..se trovi B no, e il casting è essenziale(meglio comunque usare l'instanceof).

Hai comunque sbagliato perchè scrivendo A.x accedi praticamente nel nulla, dato che gli oggetti sono di tipo B o C. (non sono comunque sicuro di quest'ultima cosa)


Title: Re:Accesso a variabili appartenenti ad una sottoclasse
Post by: crypt0 on 25-02-2010, 15:56:27
Io ho un array del tipo
Code:
A vett = new A[30];
Dove ogni elemento è inizializzato a caso tra B e C.

x sta solo in C e la chiamo con vett[  i].x (dopo aver controllato che vett fosse istanza di C)


Title: Re:Accesso a variabili appartenenti ad una sottoclasse
Post by: R3m on 25-02-2010, 16:02:17
Se controlli vett cambia tutto xD in questo caso tu escludi tutte le classi non-C..quindi quando esegui qualunque operazione la esegui solo su istanze di C...quindi si, funziona.


Title: Re:Accesso a variabili appartenenti ad una sottoclasse
Post by: crypt0 on 25-02-2010, 16:03:19
Anche senza casting?
Ricorda che le ho dichiarate come A, anche se fanno effettivamente parte di C.
Scusa la mia insistenza, ma sono diventato quasi paranoico ... in pratica se questa non va ho toppato alla grande


Title: Re:Accesso a variabili appartenenti ad una sottoclasse
Post by: R3m on 25-02-2010, 16:12:39
non hai dichiarato A ogni elemento del vettore hai dichiarato A il vettore stesso...in pratica il pc istanzia nella ram un vettore lungo n elementi sapendo a priori che conterrà A o qualunque sottoclasse di A, quando poi istanzi ad es nella posizione 0 B e nella 1 C tu hai il primo elemento B e il secondo C...in questo specifico caso non hai nessun oggetto A presente nel vettore, e dato che hai escluso (credo con l'instanceof) ogni elemento B, praticamente ti rimangono solo C.


Title: Re:Accesso a variabili appartenenti ad una sottoclasse
Post by: crypt0 on 25-02-2010, 16:27:03
non hai dichiarato A ogni elemento del vettore hai dichiarato A il vettore stesso...in pratica il pc istanzia nella ram un vettore lungo n elementi sapendo a priori che conterrà A o qualunque sottoclasse di A, quando poi istanzi ad es nella posizione 0 B e nella 1 C tu hai il primo elemento B e il secondo C...in questo specifico caso non hai nessun oggetto A presente nel vettore, e dato che hai escluso (credo con l'instanceof) ogni elemento B, praticamente ti rimangono solo C.

Grazie mille!
Mi hai salvato da più di una settimana di bile.


Title: Re:Accesso a variabili appartenenti ad una sottoclasse
Post by: R3m on 25-02-2010, 16:39:33
Di niente :)


Title: Re:Accesso a variabili appartenenti ad una sottoclasse
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 25-02-2010, 16:43:48
Contradicitur .nono.

crypt0, purtroppo avevi ragione a pensare che avevi fatto un errore.
Non so quanto peserà sulla valutazione, si badi, però è comunque un errore che impedisce la compilazione.
Una volta che dichiari un array con:
Code:
A vett = new vett [30];
per Java, ogni elemento di vett è sicuramente una variabile reference a oggetto di tipo A, anche se dovesse contenere elementi di tipo B o C (che sono comunque anche di tipo A, rendendo ancora più vera la mia frase precedente).

Accedendo a:
Code:
vett [i].x
si provoca l'errore in compile-time:
Quote
tuoFile.java:riga: cannot find symbol
symbol  : variable x
location: class A
                System.out.println ("vett [" + i + "].x = " + vett [i].x);
                                                                      ^
(giusto per fare un esempio di accesso a tale elemento).

Quindi, il casting va ovviamente fatto tramite (C) vett [i], ma solo dopo essersi assicurati che l'elemento è davvero (anche) di tipo C tramite instanceof .sisi.

Sorry guys :boh...


Title: Re:Accesso a variabili appartenenti ad una sottoclasse
Post by: LexaIdo on 25-02-2010, 16:45:26
non hai dichiarato A ogni elemento del vettore hai dichiarato A il vettore stesso...in pratica il pc istanzia nella ram un vettore lungo n elementi sapendo a priori che conterrà A o qualunque sottoclasse di A, quando poi istanzi ad es nella posizione 0 B e nella 1 C tu hai il primo elemento B e il secondo C...in questo specifico caso non hai nessun oggetto A presente nel vettore, e dato che hai escluso (credo con l'instanceof) ogni elemento B, praticamente ti rimangono solo C.

Grazie mille!
Mi hai salvato da più di una settimana di bile.

scusa ma io credo che invece il casting serva comunque  .penso
perchè a me è capitato che senza il casting mi segnalava un errore  :boh
cioè io dopo l'instanceof metto sempre il casting (C in questo caso)....
poi nn lo so, credo che ti convenga controllare tu stesso col compilatore :-ciao


Title: Re:Accesso a variabili appartenenti ad una sottoclasse
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 25-02-2010, 16:47:43
Ti ho anticipato LexaIdo, e il forum ti dovrebbe pure aver avvertito che qualcun altro aveva risposto ancora mentre tu scrivevi quando hai premuto "Post" :pray...

Sorry :boh...


Title: Re:Accesso a variabili appartenenti ad una sottoclasse
Post by: crypt0 on 25-02-2010, 16:49:10
Dannazione ...
Sapevo di dover mettere il casting  .nono
Purtroppo me ne sono reso conto solo dopo aver consegnato il compito.

Il problema è che così facendo mi si bloccano ben due parti di codice su 3!
Spero che il prof sia comprensivo.
Grazie lo stesso.


Title: Re:Accesso a variabili appartenenti ad una sottoclasse
Post by: LexaIdo on 25-02-2010, 16:50:58
Ti ho anticipato LexaIdo, e il forum ti dovrebbe pure aver avvertito che qualcun altro aveva risposto ancora mentre tu scrivevi quando hai premuto "Post" :pray...

Sorry :boh...

hai ragione  :boh  :boh non ci ho fatto caso   :pray


Title: Re:Accesso a variabili appartenenti ad una sottoclasse
Post by: R3m on 25-02-2010, 17:39:29
per fortuna io non ho scritto cose simili sul compito :nono  (vorrei anche sapere dove precisamente ti spunta una cosa simile nella terza prova di oggi)..mi dispiace di averti detto una c*****a xD comunque quando devi accedere a delle variabili, qualunque esse siano conviene pensare sempre alla superclasse che contiene tutto il necessario, in questo caso bastava che x fosse protected dentro A e avrebbe funzionato...comunque un altro "errore" che hai fatto è anche il non usare un eventuale getX()


Title: Re:Accesso a variabili appartenenti ad una sottoclasse
Post by: crypt0 on 25-02-2010, 17:59:56
per fortuna io non ho scritto cose simili sul compito :nono  (vorrei anche sapere dove precisamente ti spunta una cosa simile nella terza prova di oggi)..mi dispiace di averti detto una c*****a xD comunque quando devi accedere a delle variabili, qualunque esse siano conviene pensare sempre alla superclasse che contiene tutto il necessario, in questo caso bastava che x fosse protected dentro A e avrebbe funzionato...comunque un altro "errore" che hai fatto è anche il non usare un eventuale getX()

Allora ... appare nella prima richiesta, quella di trovare il libro con il minor numero di parole.
Avevamo la variabile P che indicava appunto il numero di parole del libro, che io ho erroneamente richiamato con vett[i ].P
Poi nella seconda si chiedeva di giustificare tutte le pagine del terzo calendario dell'archivio.
Ho trovato la terza istanza di Calendari e poi ho richiamato:
for(int i=0; i<vett[i ].pagine.length; i++)
     vett[i ].pagine.giustifica();


Title: Re:Accesso a variabili appartenenti ad una sottoclasse
Post by: R3m on 25-02-2010, 18:22:17
per fortuna io non ho scritto cose simili sul compito :nono  (vorrei anche sapere dove precisamente ti spunta una cosa simile nella terza prova di oggi)..mi dispiace di averti detto una c*****a xD comunque quando devi accedere a delle variabili, qualunque esse siano conviene pensare sempre alla superclasse che contiene tutto il necessario, in questo caso bastava che x fosse protected dentro A e avrebbe funzionato...comunque un altro "errore" che hai fatto è anche il non usare un eventuale getX()

Allora ... appare nella prima richiesta, quella di trovare il libro con il minor numero di parole.
Avevamo la variabile P che indicava appunto il numero di parole del libro, che io ho erroneamente richiamato con vett[i ].P
Poi nella seconda si chiedeva di giustificare tutte le pagine del terzo calendario dell'archivio.
Ho trovato la terza istanza di Calendari e poi ho richiamato:
for(int i=0; i<vett[i ].pagine.length; i++)
     vett[i ].pagine.giustifica();


aaaaah è una cosa bruttissima quella che hai fatto..ma perchè non hai usato un semplice getNumPagine() e getPagina(int pagina) ?


Title: Re:Accesso a variabili appartenenti ad una sottoclasse
Post by: LexaIdo on 25-02-2010, 18:37:11
anche io in questa parte del calendario ho scritto supergiù come te:
Code:
(((Calendario) vett[i]).pagine[j]).giustifica();

secondo voi è sbagliato così? .penso


Title: Re:Accesso a variabili appartenenti ad una sottoclasse
Post by: R3m on 25-02-2010, 18:51:11
anche così credo vada bene

Code:
((Calendario) vett[i]).pagine[j].giustifica();


Title: Re:Accesso a variabili appartenenti ad una sottoclasse
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 26-02-2010, 02:49:29
Allora ... appare nella prima richiesta, quella di trovare il libro con il minor numero di parole.
Avevamo la variabile P che indicava appunto il numero di parole del libro, che io ho erroneamente richiamato con vett[i ].P
Poi nella seconda si chiedeva di giustificare tutte le pagine del terzo calendario dell'archivio.
Ho trovato la terza istanza di Calendari e poi ho richiamato:
for(int i=0; i<vett[i ].pagine.length; i++)
     vett[i ].pagine.giustifica();
Ricorda sempre di mettere il codice dentro un'opportuno tag [code], altrimenti rischi di perdere codice che il parser scambierà per formattazione (come invero è realmente accaduto).

Non conosco il testo di questo esercizio.
Postalo per intero e posta per intero anche la tua soluzione, così ti sapremo dare più dettagli, anche sull'eventuale errore solo concettuale/interpretativo piuttosto che sugli ovvi errori di compilazione/esecuzione.
 :-ciao


Title: Re:Accesso a variabili appartenenti ad una sottoclasse
Post by: crypt0 on 26-02-2010, 08:49:46
Il testo l'ho già postato qui (http://forum.sdai.unict.it/index.php?topic=6979.msg44081#msg44081)

Non ho aggiunto quei metodi semplicemente perchè avevo esaurito lo spazio nell'UML, quindi ho pensato di sistemare così (metodo già testato e funzionante) ... ma caso volle che dimenticassi i casting necessari (quando sono mesi che svolgo esercizi senza mai sbagliare cose così banali)

Il resto del codice è testato e funzionante.