|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2003
Città: verona
Messaggi: 541
|
[JAVA] uso di instanceOf
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
__________________
CASE: Cooler Master Stacker 831 Silver MOBO: Asus Maximus Formula CPU: Intel Q6600@2,4ghz RAM: 2x 1GB Corsair XMS2 pc2-8500@1066mhz + 2x2GB Corsair XMS2 pc2-8500@1066mhzVGA: ATI Sapphire RADEON 5830 1GB GDDR5 HD: 2 x WD Caviar SE16 500GB Raid 0 Ultima modifica di Re_Kotc : 16-06-2008 alle 11:03. Motivo: ho aggiunto gli spazi "s" altrimenti dopo aver postato il messaggio gli spazi vuoti venivano tolti e non si capiva lo schema |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Aug 2003
Città: verona
Messaggi: 541
|
le "s" significano spazio vuoto
__________________
CASE: Cooler Master Stacker 831 Silver MOBO: Asus Maximus Formula CPU: Intel Q6600@2,4ghz RAM: 2x 1GB Corsair XMS2 pc2-8500@1066mhz + 2x2GB Corsair XMS2 pc2-8500@1066mhzVGA: ATI Sapphire RADEON 5830 1GB GDDR5 HD: 2 x WD Caviar SE16 500GB Raid 0 |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
se hai la necessità di utilizzare instanceof per sapere quale codice eseguire allora hai semplicemente sbagliato la progettazione del sistema e devi rifarla....
__________________
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Aug 2003
Città: verona
Messaggi: 541
|
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
__________________
CASE: Cooler Master Stacker 831 Silver MOBO: Asus Maximus Formula CPU: Intel Q6600@2,4ghz RAM: 2x 1GB Corsair XMS2 pc2-8500@1066mhz + 2x2GB Corsair XMS2 pc2-8500@1066mhzVGA: ATI Sapphire RADEON 5830 1GB GDDR5 HD: 2 x WD Caviar SE16 500GB Raid 0 |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
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.. ![]() quindi ancora mi sfugge quello che devi fare..
__________________
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Aug 2003
Città: verona
Messaggi: 541
|
:P intanto grazie della disponibilità
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 ?
__________________
CASE: Cooler Master Stacker 831 Silver MOBO: Asus Maximus Formula CPU: Intel Q6600@2,4ghz RAM: 2x 1GB Corsair XMS2 pc2-8500@1066mhz + 2x2GB Corsair XMS2 pc2-8500@1066mhzVGA: ATI Sapphire RADEON 5830 1GB GDDR5 HD: 2 x WD Caviar SE16 500GB Raid 0 |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4747
|
Quote:
__________________
Jappilas is a character created by a friend for his own comic - I feel honored he allowed me to bear his name Saber's true name belongs to myth - a Heroic Soul out of legends, fighting in our time to fullfill her only wish Let her image remind of her story, and of the emotions that flew from my heart when i assisted to her Fate
Ultima modifica di jappilas : 16-06-2008 alle 15:16. |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
si puoi fare benissimo in quel modo per capire di che tipo è la classe ed agire di conseguenza 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: Codice:
if (obj instanceof A) {
obj.doSomething();
} else if (obj instanceof B) {
obj.doAnotherThing();
} else if
.......
Codice:
obj.doSomething();
__________________
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Aug 2003
Città: verona
Messaggi: 541
|
@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?
__________________
CASE: Cooler Master Stacker 831 Silver MOBO: Asus Maximus Formula CPU: Intel Q6600@2,4ghz RAM: 2x 1GB Corsair XMS2 pc2-8500@1066mhz + 2x2GB Corsair XMS2 pc2-8500@1066mhzVGA: ATI Sapphire RADEON 5830 1GB GDDR5 HD: 2 x WD Caviar SE16 500GB Raid 0 |
|
|
|
|
|
#10 | ||
|
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4747
|
Quote:
Codice:
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 Quote:
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...
__________________
Jappilas is a character created by a friend for his own comic - I feel honored he allowed me to bear his name Saber's true name belongs to myth - a Heroic Soul out of legends, fighting in our time to fullfill her only wish Let her image remind of her story, and of the emotions that flew from my heart when i assisted to her Fate
Ultima modifica di jappilas : 16-06-2008 alle 20:35. |
||
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
Quote:
Codice:
f (obj instanceof A) {
((A)obj).doSomething();
} else if (obj instanceof B) {
((B)obj).doAnotherThing();
} else if
__________________
|
|
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Jul 2005
Messaggi: 291
|
il polimorfismo in 2 parole in croce ti permette di fare una cosa tipo
Codice:
public abstract class A{
public abstract void doSomething();
}
Codice:
public class B extends A{
public void doSomething(){System.out.println("Sono B");}
}
Codice:
public class C extends A{
public void doSomething(){System.out.println("Sono C");}
}
Codice:
public class Test{
public static void main(String[] args){
A a1=new B();
A a2=new C();
a1.doSomething();
a2.doSomething();
}
}
Codice:
Sono B Sono C
__________________
CPU: Intel Core 2 Quad Q6600 - Mobo: Asus P5E - RAM:4x2GB DDR2 - sk video: Power Color ATI Radeon HD3870 - HD:Western Digital 750GB |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Aug 2003
Città: verona
Messaggi: 541
|
grazie mille a tutti!! davvero!
gracias!! buona giornata !
__________________
CASE: Cooler Master Stacker 831 Silver MOBO: Asus Maximus Formula CPU: Intel Q6600@2,4ghz RAM: 2x 1GB Corsair XMS2 pc2-8500@1066mhz + 2x2GB Corsair XMS2 pc2-8500@1066mhzVGA: ATI Sapphire RADEON 5830 1GB GDDR5 HD: 2 x WD Caviar SE16 500GB Raid 0 |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:32.





















