PDA

View Full Version : [JAVA] uso di instanceOf


Re_Kotc
16-06-2008, 09:55
salve a tutti!, ho creato una classe astratta che è estesa da diverse classi concrete e da un'ulteriore classe astratta estesa a sua volta da altre classi concrete, sembra un delirio ma provo a schematizzare C.A = classe astratta e C.C uguale classe concreta

Classe A Astratta
|ssssssss|ssssss|
|ssssssss|ssssss|
|ssssssss|ssssss|
C.AssssssC.CssssC.C
|s|
|s|
|s|
C.C C.C

Dato che inizialmente viene creata una matrice di tipo "classe A astratta" che può contenere uno qualsiasi dei tipi concreti definiti al suo interno ( ma la scelta di cosa contiene ogni elemento della matrice è random) come faccio per sapere cosa contiene? uso istanceOf() in che modo? non l'ho mai fatto prima e devo capirlo assolutamente perchè a seconda dell'istanza che ottengo devo compiere certe operazioni...grazie :)

Re_Kotc
16-06-2008, 10:00
le "s" significano spazio vuoto :D...se però non riempivo quegli spazi dopo aver postato venivano cancellati e non si capiva più lo schema

^TiGeRShArK^
16-06-2008, 11:02
se hai la necessità di utilizzare instanceof per sapere quale codice eseguire allora hai semplicemente sbagliato la progettazione del sistema e devi rifarla....

Re_Kotc
16-06-2008, 11:19
mmmh...non sono sicuro di aver capito il tuo commento..in realtà è la struttura di un progetto che mi è stato consegnato per esercitarmi..e non è che possa variare più di tanto, l'idea di usare instanceof è mia ma avere una matrice di elementi astratti che vengono riempiti con oggetti concreti random è parte del testo dell'esercizio...per questo non riesco a proseguire :D...e non posso modificare la cosa visto che devo rispettare le specifiche..se poi sono state scritte da incompetenti questo non so dirtelo..

^TiGeRShArK^
16-06-2008, 11:43
ah ok, se è fatto per esercizio allora va bene...
instanceof ti dice semplicemente se l'oggetto istanziato è di un certo tipo.
Comunque non puoi avere una matrice di oggetti astratti dato che un oggetto astratto non può essere istanziato.. :mbe:
quindi ancora mi sfugge quello che devi fare.. :fagiano:

Re_Kotc
16-06-2008, 11:56
:P intanto grazie della disponibilità :), cmq io prima dichiaro questa matrice senza istanziare niente

MazeElement[][] maze;

MazeElement è la classe astratta che contiene tutte le altre, poi però secondo dei parametri passati dall'esterno devo istanziare ogni elemento della matrice tramite un new classeConcreta(), però io non so quale delle classi concrete verrà utilizzata per instanziare l'oggetto in una determinata posizione della matrice visto che questo è deciso dall'esterno.
il punto è che poi scorrendo la matrice a seconda dell'oggetto istanziato devo effettuare delle operazioni diverse, ma come faccio a sapere se l'oggetto è di una o di un'altra classe?

tipo così?

if (maze[i][j] instanceof classeA){ ecc

?

jappilas
16-06-2008, 12:36
e non posso modificare la cosa visto che devo rispettare le specifiche..se poi sono state scritte da incompetenti questo non so dirtelo..credo che una soluzione adatta in questo caso sia usare semplicemente il polimorfismo delle classi concrete in fase di accesso agli oggetti contenuti nella matrice, e una factory esterna in fase di riempimento della matrice... violerebbe le specifiche?

^TiGeRShArK^
16-06-2008, 12:39
:P intanto grazie della disponibilità :), cmq io prima dichiaro questa matrice senza istanziare niente

MazeElement[][] maze;

MazeElement è la classe astratta che contiene tutte le altre, poi però secondo dei parametri passati dall'esterno devo istanziare ogni elemento della matrice tramite un new classeConcreta(), però io non so quale delle classi concrete verrà utilizzata per instanziare l'oggetto in una determinata posizione della matrice visto che questo è deciso dall'esterno.
il punto è che poi scorrendo la matrice a seconda dell'oggetto istanziato devo effettuare delle operazioni diverse, ma come faccio a sapere se l'oggetto è di una o di un'altra classe?

tipo così?

if (maze[i][j] instanceof classeA){ ecc

?
ok ora è chiarissimo :)
si puoi fare benissimo in quel modo per capire di che tipo è la classe ed agire di conseguenza :p
nel "mondo reale" piuttosto che fare una cosa del genere, ogni oggetto di tipo diverso avrà al suo interno dei metodi che si comportano in maniera diversa a seconda del tipo istanziato..
Praticamente, sfruttando il polimorfismo, anzichè fare qualcosa del genere:

if (obj instanceof A) {
obj.doSomething();
} else if (obj instanceof B) {
obj.doAnotherThing();
} else if
.......

basterebbe fare:

obj.doSomething();

e ogni tipo saprà già come comportarsi correttamente, risparmiandoti una bella catena di if-else :p

Re_Kotc
16-06-2008, 15:07
@tigershark : ok :P quindi da quanto ho capito posso fare con le instanceOf() e poi gestire di conseguenza una catena di if XD....vabbene grazie!



@jappilas : sorry ma sei troppo tecnico per le mie molto modeste conoscenze di java non ho capito cosa intendi :)


cmq avrei un secondo dubbio legato a questo, se poi l'elemento della matrice
maze[i][j] contiene un 'istanza della classe concreta A che estende MazeElement, io posso usare direttamente su questa istanza i metodi definiti nella classe concreta A ? del tipo

if (obj instanceof A) {
obj.doSomething();
} else if (obj instanceof B) {
obj.doAnotherThing();
} else if

dove :

class A extends MazeElement {


public int doSomething(); ecc


}

cioè il metodo è definito nella classe concreta e maze[i][j] contiene un'istanza di tale classe, posso usare direttamente il metodo in quel modo?

jappilas
16-06-2008, 17:59
cioè il metodo è definito nella classe concreta e maze[i][j] contiene un'istanza di tale classe, posso usare direttamente il metodo in quel modo?cioè usare maze[i][j].doSomething() ?

certo, se in doSomething incapsuli il comportamento differenziato di ogni istanza ( quello che prima avresti fatto eseguire sulla base degli esiti dei controlli di tipo ) - si tratta appunto del polimorfismo a cui ci si riferiva prima :)

sorry ma sei troppo tecnico per le mie molto modeste conoscenze di java non ho capito cosa intendihai ragione, scusami :p
il factory è un pattern che consente la creazione di oggetti senza sapere a priori a quale classe concreta appartengono ( l' importante sarebbe che sia esportato un metodo di creazione comune) - ma in effetti se nel tuo caso dovevi randomizzare i tipi degli oggetti inseriti nella matrice, probabilmente la soluzione è ancora più semplice...

^TiGeRShArK^
16-06-2008, 19:41
cmq avrei un secondo dubbio legato a questo, se poi l'elemento della matrice
maze[i][j] contiene un 'istanza della classe concreta A che estende MazeElement, io posso usare direttamente su questa istanza i metodi definiti nella classe concreta A ? del tipo

if (obj instanceof A) {
obj.doSomething();
} else if (obj instanceof B) {
obj.doAnotherThing();
} else if

dove :

class A extends MazeElement {


public int doSomething(); ecc


}

cioè il metodo è definito nella classe concreta e maze[i][j] contiene un'istanza di tale classe, posso usare direttamente il metodo in quel modo?

si ma devi effettuare prima il cast:

f (obj instanceof A) {
((A)obj).doSomething();
} else if (obj instanceof B) {
((B)obj).doAnotherThing();
} else if

morskott
16-06-2008, 20:34
il polimorfismo in 2 parole in croce ti permette di fare una cosa tipopublic abstract class A{
public abstract void doSomething();
}public class B extends A{
public void doSomething(){System.out.println("Sono B");}
}public class C extends A{
public void doSomething(){System.out.println("Sono C");}
}per poi utilizzarle cosìpublic class Test{
public static void main(String[] args){
A a1=new B();
A a2=new C();
a1.doSomething();
a2.doSomething();
}
}che stampa rispettivamenteSono B
Sono C

Re_Kotc
17-06-2008, 08:07
grazie mille a tutti!! davvero! :)....ho capito alcune cose importanti sul polimorfismo e su come usare quel maledetto instanceOf() :D.....
gracias!!

buona giornata !