Avatar billede Swift Praktikant
17. maj 2003 - 10:43 Der er 8 kommentarer og
3 løsninger

Abstrakt klasse array - hvordan findes klassetypen?

Jeg har en klasse der opretter et array ud fra en abstrakt klasse:
private cAbstractHest[] hestene;
hestene = new cAbstractHest[10];

Senere smides der objekter af de nedarvede klasser i:
hestene[0] = new cHestPony();
hestene[1] = new cHestNormal();
hestene[2] = new cHestIslandsk();

Når jeg klikker på en hest fra listen over heste typer:
movingHest = hestene[i]; (i findes ud fra kordinaterne(hit-detection))

Når jeg slipper igen ved de udvalgte heste:
deUdvalgteHeste[i] = movingHest;


NU ER PROBLEMET SÅ:
I mit program viser jeg billeder over alle hestetyperne.
Når jeg så trækker en hest fra hestelisten ned på udvalgte heste - så vil jeg lave så de heste der trækkes er NYE heste - altså IKKE referencer til de hestelisten.
Efterfølgende vil jeg fx gerne navngive hestene individuelt.
Men pt. går det glat fordi de heste jeg trækker ud er referencer til de overordnede heste-objekter.

Helst ville jeg lave noget i regning af:
movingHest = new (Type)hestene[i].GetType();
Men det virker ikke.

Er der nogle gode ideer ??
Avatar billede burningice Nybegynder
17. maj 2003 - 11:10 #1
prøv med Activator-klassen, i og med at det skal ske runtime

Type t = typeof(hestene[i]);
movingHest = (t)Activator.CreateInstance(t);
Avatar billede Swift Praktikant
17. maj 2003 - 11:17 #2
Det virker ikke - den melder fejl her:  [i] );
Avatar billede nielslbeck Nybegynder
17. maj 2003 - 11:21 #3
Du skal bruge:

Type t = hestene[i].GetType();
Avatar billede Swift Praktikant
17. maj 2003 - 11:25 #4
t er ubekendt !!
(134): The type or namespace name 't' could not be found (are you missing a using directive or an assembly reference?)
Avatar billede nielslbeck Nybegynder
17. maj 2003 - 11:45 #5
Tror ikke man kan caste til en type som findes runtime... så en anden (og noget grimmere) løsning vil være:

Type t = hestene[i].GetType();
switch (t.FullName) {
  case "mitNamespace.cHestPony":
    movingHest = new cHestPony();
    break;
  case "mitNamespace.cHestNormal":
    movingHest = new cHestNormal();
    break;
  case "mitNamespace.cHestIslandsk":
    movingHest = new cHestIslandsk();
    break;
  default:
    throw new Exception("Pokkers! Ukendt hest!");
}
Avatar billede Swift Praktikant
17. maj 2003 - 11:53 #6
Super cool løsning - hvis man kun har 4 typer og ikke forventer flere.

Er der ikke noget smartere - når man nu løbende gerne vil klaske flere heste på...?
Avatar billede nielslbeck Nybegynder
17. maj 2003 - 11:56 #7
Nemlig... noget grimmere... og ikke særlig anvendelig hvis man har en stor gård med mange heste ;-)

Tror ikke der er en kanon smart løsning... med mindre du kan leve med, at din movingHest er af typen object - for så virker:

Type t = hestene[i].GetType();
movingHest = Activator.CreateInstance(t);

Men jeg tror ikke det er muligt, at caste til en type som findes runtime :-(
Avatar billede Swift Praktikant
17. maj 2003 - 12:09 #8
HEY - Jeg tror jeg har fat i noget - nielsbeck gav mig en ide:

Type t = hestene[i].GetType();
movingHest = (cAbstractHest)Activator.CreateInstance(t);

Mon ikke den holder ??
Avatar billede burningice Nybegynder
17. maj 2003 - 12:13 #9
swift>> hehe.. joo, det kan du da for såvidt godt... men har du ikke et interface du kan caste til istedet? det tror jeg vil være noget pænere
Avatar billede Swift Praktikant
17. maj 2003 - 14:08 #10
Jeg løste problemet med:
Type t = hestene[i].GetType();
movingHest = (cAbstractHest)Activator.CreateInstance(t);

cyberfessor: Skriv lige et svar - så du også kan få nogle points!
Avatar billede burningice Nybegynder
17. maj 2003 - 14:14 #11
svar :)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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