Avatar billede appel Novice
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 ?
Avatar billede appel Novice
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...
Avatar billede 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
}
Avatar billede appel Novice
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).
Avatar billede 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
  }
}
Avatar billede appel Novice
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...
Avatar billede appel Novice
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){
  ...
  }
Avatar billede 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
Avatar billede appel Novice
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...).
Avatar billede 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
Avatar billede appel Novice
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){
  ...
  }
Avatar billede appel Novice
17. februar 2003 - 16:49 #11
woops der skulle have stået "og så i Element klassen" !
Avatar billede appel Novice
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){
  ...
  }
Avatar billede arne_v Ekspert
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();
}
Avatar billede appel Novice
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 :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester