![]() |
Über Hauptklasse auf Unterklasse zugreifen? Greift hier as?
Hallo,
ich stehe glaube in einer Sackgasse und ich komme den ganzen Vormittag nicht mehr weiter. Vorgeschichte: Ich habe ein Array gefüllt mit Instanzen einer Klasse. Das Array ist ein
Delphi-Quellcode:
in dem Instanzen von TRabbit, TFox usw., welche alle von TCreature abgeleitet sind, gespeichert werden.
array of TCreatur
Jetzt möchte ich gerne über das Array auf die Methoden von TRabbit, TFox usw. zugreifen, nach dem Schema:
Delphi-Quellcode:
Das funktioniert natürlich nicht, da TCreature ja nicht die Methoden der Ableger kennt. Nun dachte ich mir, ich nutze "as". Das heißt konkret, ich erstelle einen Pointer auf eine Position des Arrays und greife darauf zu:
MeinArray[X][Y].EineMethodeVonTFox(Wert, NochEinWert: Integer);
Delphi-Quellcode:
Da gibt es dann aber eine Zugriffsverletzung, obwohl sich an dieser Position wirklich eine Instanz von TRabbit befinden (!). Wie kann ich jetzt auf die Methoden von Habitat.WorldArray[i][j] zugreifen? Hat jemand eine Idee?
SelectedRabbit^ := Habitat.WorldArray[i][j] as TRabbit;
|
Re: Über Hauptklasse auf Unterklasse zugreifen? Greift hier
|
Re: Über Hauptklasse auf Unterklasse zugreifen? Greift hier
Zitat:
Delphi-Quellcode:
Dein Beispiel: (MyFruit as TcitrusFruit).Squeeze
(Habitat.WorldArray[i][j] as TRabbit).DoMove;
|
Re: Über Hauptklasse auf Unterklasse zugreifen? Greift hier
Es klappt doch - der Fehler liegt wo anders. Danke, jetzt brauche ich noch nicht einmal mehr einen Pointer, klappt auch so wunderbar!
|
Re: Über Hauptklasse auf Unterklasse zugreifen? Greift hier
Zitat:
Delphi-Quellcode:
Ansonsten kann es sein, daß Du ein TFox da reinpackst und ich weiss nicht, was eine Hase macht, wenn man ihm am Fuchsschwanz packt ;-)
if (Habitat.WorldArray[i][j] is TRabbit) then
SelectedRabbit^ := Habitat.WorldArray[i][j] as TRabbit; |
Re: Über Hauptklasse auf Unterklasse zugreifen? Greift hier
Oder performanter:
Delphi-Quellcode:
as ruft schon is auf, deswegen reicht hier ein einfacher Cast.
if (Habitat.WorldArray[i][j] is TRabbit) then
SelectedRabbit^ := TRabbit(Habitat.WorldArray[i][j]); Außerdem: Was soll SelectedRabbit^? Wenn SelectedRabbit vom Typ TRabbit ist, was ich annehme, brauchst du keine Dereferenzierung! |
Re: Über Hauptklasse auf Unterklasse zugreifen? Greift hier
is habe ich schon von Anfang an drin, hatte es nur nicht gepostet.
Edit: @Chewie: Hatte anfangs versucht, über einen Pointer darauf zuzugreifen, was natürlich Nonsense ist. Btw, Chewie, Deine Version ist sogar noch besser, hatte vorher noch ne EAV, mit deiner Version aber nicht mehr. Riesen-Danke! Wieder was gelernt! :dp: :dance: :thuimb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz