Pages: [1] 2   Go Down
Print
Author Topic: Accesso a variabili appartenenti ad una sottoclasse  (Read 3332 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
crypt0
Apprendista Forumista
**
Offline Offline

Posts: 109


« 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?
Logged
R3m
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 486



« Reply #1 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)
Logged

Ciò che è nostro è stato in campo sudato....ciò che vostro è stato in aula assegnato.
In serie B non sei mai stato perchè la prescrizione t'ha salvato.
crypt0
Apprendista Forumista
**
Offline Offline

Posts: 109


« Reply #2 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)
« Last Edit: 25-02-2010, 15:58:38 by crypt0 » Logged
R3m
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 486



« Reply #3 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.
Logged

Ciò che è nostro è stato in campo sudato....ciò che vostro è stato in aula assegnato.
In serie B non sei mai stato perchè la prescrizione t'ha salvato.
crypt0
Apprendista Forumista
**
Offline Offline

Posts: 109


« Reply #4 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
Logged
R3m
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 486



« Reply #5 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.
Logged

Ciò che è nostro è stato in campo sudato....ciò che vostro è stato in aula assegnato.
In serie B non sei mai stato perchè la prescrizione t'ha salvato.
crypt0
Apprendista Forumista
**
Offline Offline

Posts: 109


« Reply #6 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.
Logged
R3m
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 486



« Reply #7 on: 25-02-2010, 16:39:33 »

Di niente Smiley
Logged

Ciò che è nostro è stato in campo sudato....ciò che vostro è stato in aula assegnato.
In serie B non sei mai stato perchè la prescrizione t'ha salvato.
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #8 on: 25-02-2010, 16:43:48 »

Contradicitur .

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 .

Sorry guys boh...
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
LexaIdo
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 110



« Reply #9 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 
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
« Last Edit: 25-02-2010, 16:48:18 by LexaIdo » Logged
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #10 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...
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
crypt0
Apprendista Forumista
**
Offline Offline

Posts: 109


« Reply #11 on: 25-02-2010, 16:49:10 »

Dannazione ...
Sapevo di dover mettere il casting  
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.
Logged
LexaIdo
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 110



« Reply #12 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
Logged
R3m
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 486



« Reply #13 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()
Logged

Ciò che è nostro è stato in campo sudato....ciò che vostro è stato in aula assegnato.
In serie B non sei mai stato perchè la prescrizione t'ha salvato.
crypt0
Apprendista Forumista
**
Offline Offline

Posts: 109


« Reply #14 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();
Logged
Pages: [1] 2   Go Up
Print
Jump to: