17. februar 2003 - 16:00
Der er
12 kommentarer og 2 løsninger
tilgang til flere forskellige typer objekter i vector
Jeg vil gerne opbevare flere forskellige typer af objekter i en Vector, og behandle de forskellige objekter ud fra deres type (klasse). Eksempel: public class Element { static Vector liste; public static void main(String[] args) { Element e = new Element(); liste = new Vector(); ElemA a = new ElemA(); ElemB b = new ElemB(); a.x = 10; a.y = 20; b.w = 30; b.z = 40; liste.addElement(a); liste.addElement(b); doSomething(liste.elementAt(0)); doSomething(liste.elementAt(1)); } private static void doSomething(ElemA object) { } private static void doSomething(ElemB object) { } } Problemet er så at elementerne i min Vector liste opfattes som objekter af Object klassen. Hvordan ordner jeg det ?
Annonceindlæg tema
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
17. februar 2003 - 16:02
#1
Det skal måske nævnes at ElemA og ElemB ser således ud: public class ElemA { int x; int y; } public class ElemB { int z; int w; } Yderligere er det ikke noget krav at det objekterne skal opbevares i en Vector...
Slettet bruger
17. februar 2003 - 16:09
#2
Object obj = liste.get(0); if( obj instanceof EmelA ) { ElemA elemA = (ElemA)obj; //do stuff } else if ( obj instanceof ElemB ) { ElemB elemB = (ElemB)obj; //do stuff }
17. februar 2003 - 16:10
#3
Yderligere skal det nævnes at man ikke ved hvilken rækkefølge at de forskellige typer objekter ligger i (dvs ovenstående eksempel er forsimplet).
Slettet bruger
17. februar 2003 - 16:14
#4
kør igennem vectoren i en løkke og brug if else som ovenfor til at kalde en metode til den enkelte type for (int i = 0; i<liste.size(); i++) { Object obj = liste.get(i); if( obj instanceof EmelA ) { ElemA elemA = (ElemA)obj; //do stuff } else if ( obj instanceof ElemB ) { ElemB elemB = (ElemB)obj; //do stuff } }
17. februar 2003 - 16:15
#5
kan man ikke kalde en metode ud fra objektets type? Selvom det jo er opbevaret som et objekt af typen Object...
17. februar 2003 - 16:17
#6
jeg ville bare gerne at man kunne gøre det lidt mere "elegant"... I stil med: for (int i = 0; i<liste.size(); i++) { Object obj = liste.get(i); obj.doSomething; } public void doSomething(ElemA e){ ... } public void doSomething(ElemB e){ ... }
Slettet bruger
17. februar 2003 - 16:17
#7
du er nødt til at caste dit object efter det er kommet ud af vectoren, og er derfor nødt til at vice hvad type det har
17. februar 2003 - 16:18
#8
ja ok se lige bort fra der er åbenlyse fejl i netop ovenstående eksempel (håber ideen skinner igennem dog...).
Slettet bruger
17. februar 2003 - 16:20
#9
du kan ikke gøre noget på objectet uden at kaste det til den rigitge type først
17. februar 2003 - 16:48
#10
Har lavet det på følgende måde... er dog ikke sikker om den er mere elegant? public interface Elem { public void performAction(Element e); } public class ElemA implements Elem{ int x; int y; public void performAction(Element e){ e.doSomething(this); } } og så i Elem klassen: for (int i = 0; i<liste.size(); i++) { Object obj = liste.get(i); obj.doSomething; } public void doSomething(ElemA e){ ... } public void doSomething(ElemB e){ ... }
17. februar 2003 - 16:49
#11
woops der skulle have stået "og så i Element klassen" !
17. februar 2003 - 16:51
#12
sorry sådan her skulle Element klassen så se ud: for (int i = 0; i<liste.size(); i++) { Object obj = liste.get(i); obj.performAction(element); } public void doSomething(ElemA e){ ... } public void doSomething(ElemB e){ ... }
17. februar 2003 - 17:11
#13
Jeg tror du har brug for: public interface Elem { public void performAction(); } public class ElemA implements Elem { int x; int y; public void performAction() { // do whatever } } public class ElemB implements Elem { int z; int w; public void performAction() { // do whatever } } for (int i = 0; i<liste.size(); i++) { Elem e = (Elem)liste.get(i); e.doSomething(); }
17. februar 2003 - 17:24
#14
Hmmm det viser sig faktisk at mit problem ikke skal løses på den måde jeg har stille i starten... Men i får lige lidt point for jeres anstrengelser alligevel :-)
Kurser inden for grundlæggende programmering