Newsgroup: it.comp.java
Titolo: [Newbie] domanda base sulla OOP in java

Salve,
    	mi sto avvicinando al java e volevo esporre un quesito che 
probabilmente e' molto di base. A me hanno sempre spiegato che se
io uso una classe collection tipo:
ArrayList lista = new ArrayList();
poi ci posso mettere dentro qualunque oggetto che estende Object
(quindi tutti gli oggetti) col medoto add. Ora, se io uso questo
stratagemma per mettere nell'array oggetti istanze di classi
diverse, poi quando ispeziono l'array per tirar via gli oggetti ne
ho perso l'identità. Come posso (senza sapere a priori a che classe
appartengono gli oggetti dell'array) risalire alla classe che ogni
oggetto aveva prima che fosse messo nell'array (e di conseguenza
poter chiamare i suoi metodi dopo averlo castato al giusto tipo?)
Esempio:
public class Padre { ... }
public class FiglioMaschio extends Padre { ... }
public class FigliaFemmina extends Padre { ... }
ArrayList lista = new ArrayList();
FiglioMaschio Paolo = new FiglioMaschio();
FigliaFemmina Elena = new FigliaFemmina();
lista.add(Paolo);
lista.add(Elena);
Ora, l'array contiene un figlio maschio ed una figlia femmina...
Object MrX = lista.get(0);
MrX dovrebbe essere Paolo... ma è un Object. Come posso sapere
se è un oggetto FiglioMaschio o FigliaFemmina, ad esempio?
Mi sfugge qualcosa. :)
Grazie a chi mi vorrà rispondere.
Ciao, SaCcA

 Object MrX = lista.get(0);
Meglio:
	Padre mrX = (Padre) lista.get(0);
A questo punto hai un'oggetto di classe Padre e saranno cavoli tuoi
gestirtelo.
E' per questi motivi che esistono le interfaccie e che gli oggetti
devono essere usati "cum grano salis".
Davide

dav...@yahoo.com
 wrote in news:ap1es6$qgka8$
3...@ID-18487.news.dfncis.de
:

Ancora mi sfugge qualcosa. "saranno cavoli tuoi gestirlo" può voleri dire
che io ad esempio metto nella classe padre un int che funge da
riconoscitore di tipo? (Es 0=FiglioMaschio, 1=FigliaFemmina, ecc). Così
ad occhio funziona (so a che classe appartiene l'oggetto e posso
castarlo) ma non è una cosa che va contro i concetti base dell'OOP?
Grazie ancora,
SaCcA

 se è un oggetto FiglioMaschio o FigliaFemmina, ad esempio?
if(MrX instanceof FiglioMaschio){
 //fai qualcosa con il figlio maschio, contento tu...:-)
}
--
Antonio Pelleriti
Brainbench Java Master: score 4.34,
higher than 99% of all previous test takers.

 poter chiamare i suoi metodi dopo averlo castato al giusto tipo?)
Il "senza sapere a priori" puo' o meno incidere. In genere, se gli oggetti 
ce li metti dentro tu, sai di che tipo sono - nel qual caso, instanceof e 
cast ti permettono di convertire correttamente il tipo statico e scrivere 
codice di conseguenza.
Se non lo sai (ad esempio, metti oggetti nella collection la cui classe e' 
definita dall'utente ad ogni esecuzione) _per definizione_ significa che a 
compiletime non puoi assumere - su quegli oggetti - niente: il che, in 
Java, equivale ad avere soltanto, appunto, i metodi di Object. Per 
*scoprire* a runtime che classe e metodi ci sono usi la reflection 
(java.lang.reflect.*).
Il punto iniziale e' che ogni oggetto Java e' associato ad un oggetto Class 
(che incapsula alcune informazioni sulla sua classe), che e' recuperabile 
tramite il metodo getClass() di object. Dato un'oggetto Class, puoi 
"scoprire" che metodi e membri la classe e, e invocarli indirettamente (ad 
esempio, Class ti permette di ottenere oggetti Method, il cui metodo 
"invoke" determina l'invocazione del metodo relativo su una specifica 
istanza di oggetto, sollevando eccezioni se l'oggetto non e' della classe 
giusta eccetera).
Di oggetti Class, ne esiste esattamente uno per ogni classe definita nel 
sistema, quindi per verificare, ad esempio, se due oggetti sono della 
stessa classe, puoi usare codice come if (obj1.getClass() == 
obj2.getClass()) eccetera
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

 riconoscitore di tipo?
No, vuol dire che accetti nella tua Collection solo oggetti che 
implementano una determinata interfaccia. La loro classe diventa quindi 
irrilevante, dato che vi accedi tramite l'interfaccia.
