Avatar billede jespersahner Nybegynder
15. marts 2005 - 15:47 Der er 7 kommentarer og
1 løsning

Cast til dynamisk load'et klasse

Lad v være et Vector-object, og antag at elementerne i v er knyttet til klasser, der er dynamisk load'et ved run-time.

Antag videre at vi ved, at klassen hørende til f.eks. det første element i v indeholder en int. kaldet x (lige som f.eks. Point-klassen).

Hvis vi ønsker at referere til x, og vi kender klassen, kan vi skrive:

((Klasse)v.get(0)).x=5;

Hvis vi imidlertid ikke kender klassen (denne load'es først på run-time, men vi dog ved, at klassen indeholder x, hvordan skriver man så koden?
Avatar billede di8leva Nybegynder
15. marts 2005 - 15:52 #1
Jeg skulle nok gøre et interface, f.eks "Xable" med en metode "getX();" och lave min klasse sådan her:

public class Klasse implements Xable

Så hvis du ved at klassen indeholder x, så ved du også at den er "Xable" og du finder x ved at:
((Xable)v.get(0)).getX();

detsamme hvis du vil sette X
Avatar billede di8leva Nybegynder
15. marts 2005 - 15:52 #2
selvfølig kan du også testa først

if(v.get(0) instanceof Xable)
    ((Xable)v.get(0)).setX(5);
Avatar billede jespersahner Nybegynder
15. marts 2005 - 16:01 #3
->di8leva: Enig, men klassen indeholder ikke nødvendigvis et interface.
Avatar billede simonvalter Praktikant
15. marts 2005 - 16:03 #4
det burde den vel gøre så.. der er kun de 2 måder at gøre det på hvad jeg ved af.
Avatar billede jespersahner Nybegynder
15. marts 2005 - 16:09 #5
Såfremt jeg havde referencer (ref0, ref1,...) til de enkelte elementer i v, ville jeg blot kunne skrive:

ref0.x

I mit tilfælde eksisterer v imidlertid uden for den klasse, hvor referencerne måtte optræde, så jeg har kun v selv.
Avatar billede snoop_one Nybegynder
15. marts 2005 - 17:53 #6
Du kan også benytte dig af reflection og introspection mekanismerne i sproget.
Hvis du kan skrive v.x (hvilket er meget forkert - brug accessor metoder i stedet (lav kobling, høj samhørighed)) så kan du benytte reflection til at manipulere med attributten eller endnu bedre - kalde accessor metoden, f.eks. setX(5).

Desuden er det ikke nok at vide at attributten x er der – du antager vel også at den er public og ikke final. Hvis den så er final så antager du, at den ikke være initialiseret.

Ulempen med reflection er, at du mister typesikkerheden. Det helt optimale ville være at have et eller flere interfaces som kategoriserer de dynamisk loadede klasser - ligesom di8leva foreslår det. Men eftersom jeg ikke kender applikationen ved jeg ikke om det er en mulighed...
Avatar billede jespersahner Nybegynder
23. marts 2005 - 14:20 #7
..et svar :-)
Avatar billede snoop_one Nybegynder
23. marts 2005 - 19:15 #8
jep...
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