PDA

View Full Version : [Java] Come ottenere riferimenti da altre classi...


Fire Fox II
28-01-2012, 13:49
Salve raga...

descrivo il mio problema...

Ho tre classi A, B, e C create in sequenza ognuna delle quali crea una nuova classe D... Quest'ultima però deve far riferimento ad un valore contenuto nella classe A...

Quindi come posso ( se posso ) chiamare da D il metodo della classe A inizialmente creata?

Thanks

demos88
28-01-2012, 14:37
Ma parli di classi o oggetti?
Da una classe istanzi un oggetto, per accedere a un metodo di un oggetto di A da dentro un oggetto D, D deve avere un riferimento ad A e chiami il metodo su quello.
Alternativamente puoi usare un valore statico in A, però il discorso è troppo generico, oltre che poco chiaro. Probabilmente scrivendo il programma in modo diverso risulta molto più semplice.

Fire Fox II
28-01-2012, 15:00
Mi rendo conto di non essere una cima in quanto a spiegazioni... :)

Comunque stando al grafico qui di seguito, la creazione D dovrebbe stamparmi x... Possibile?

http://img141.imageshack.us/img141/3871/tempsi.png

demos88
28-01-2012, 15:21
Sinceramente il grafico non è molto chiaro, dice tutto e niente, di fatto non descrive nulla del comportamento del programma...
Posso solo intuire che da una classe (probabilmente in un metodo static main) vengono creati 3 oggetti istanziandoli da A, B e C rispettivamente.
Poi dentro ad ognuno dei costruttori delle suddette classi, viene istanziato un oggetto dalla classe D.
La variabile "valore" che viene impostata a x, non appartiene alla classe A, ma alla classe nella quale viene eseguito il codice che istanzia A.
Qualcosa del genere insomma:

A a = new A();
B b = new B();
C c = new C();
valore = x;

Poi nei costruttori di A, B e C c'è una istruzione che istanzia un oggetto di tipo D:

D d = new D();

Io non so cosa facciano questi oggetti d (sono 3 in tutto, uno per a, uno per b e uno per c), ma se dentro a d vuoi avere un riferimento a "valore", devi o modificare i costruttori di A, B e C in modo che prendano come parametro un riferimento a "valore" (sempre se questo non è un tipo primitivo, che allora devi incapsulare in una classe) e che poi lo girano al costruttore di D; oppure se il metodo in cui crei a, b e c è statico, devi rendere "valore" un campo statico della classe e poi ti riferisci ad esso così: NomeClasse.valore .
Oppure ancora, se il metodo non è statico, passi ai costruttori di A, B e C un riferimento this, e prevedi un metodo di get. Esistono anche altre soluzioni, ma non so nulla del contesto, quindi è poco utile formulare altre ipotesi.
Comunque è troppo vago... è una esercitazione? un esempio?

Fire Fox II
28-01-2012, 15:34
Mmmm, praticamente ho un JFrame principale con all'interno diversi pulsanti...

Ognuno di questi una volta premuto crea una nuova classe la quale usa D per connettersi ad un database... L'indirizzo del database però viene stabilito nella classe principale quindi dovrei fare in modo che D riesca a risalire a tale indirizzo...

Spero che spiegandolo così risulti più comprensibile... :)

Passare i riferimenti non è facile in quanto il percorso in alcuni casi potrebbe essere lungo... Però da quello che sto capendo mi sa che è l'unico modo...

tomminno
28-01-2012, 15:35
Detta così sembra un bel problema di disegno delle classi.
C crea D che deve accedere ad una variabile di A?
E se A non esistesse?

Una soluzione che non coinvolga il ridisegno completo delle classi (secondo me sarebbe la soluzione da seguire) potrebbe essere quella di far implementare ad A una interfaccia per la proprietà che interessa e passarla al costruttore di B, C e di conseguenza D.

Fire Fox II
28-01-2012, 17:47
La classe contenente la variabile necessaria è quella principale e deve esistere per forza...

Ridisegnare le classi significa usare la soluzione proposta da demos88 che passi sempre il riferimento this?

Ma la classe principale non può creare un riferimento a cui possa accedere D ?

tomminno
29-01-2012, 15:17
La classe contenente la variabile necessaria è quella principale e deve esistere per forza...


Nella programmazione ad oggetti non esiste il concetto del "deve esistere per forza" ;)


Ridisegnare le classi significa usare la soluzione proposta da demos88 che passi sempre il riferimento this?

Ma la classe principale non può creare un riferimento a cui possa accedere D ?

Se non ho capito male il tuo problema è l'aver legato troppo strettamente la GUI alla logica del programma.
Intanto come mai la stringa di connessione ce l'ha la classe principale?
Non potresti usare una classe con metodi statici per l'accesso alla configurazione? Immagino che la stringa di connessione sia una variabile configurabile del programma e non cablata nel codice, ma anche se lo fosse potresti incorporarla in una classe Configurations e imporre sul costruttore di D che debba essere passata la stringa di connessione (e se non viene fatto se la recupera da Configurations, diciamo che non è bellissimo ma può andare).

Dovresti (a questo punto direi per il prossimo progetto) separare la parte grafica dalla logica.