Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Über Hauptklasse auf Unterklasse zugreifen? Greift hier as? (https://www.delphipraxis.net/19442-ueber-hauptklasse-auf-unterklasse-zugreifen-greift-hier.html)

Nonsense 3. Apr 2004 13:06


Ü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:
array of TCreatur
in dem Instanzen von TRabbit, TFox usw., welche alle von TCreature abgeleitet sind, gespeichert werden.

Jetzt möchte ich gerne über das Array auf die Methoden von TRabbit, TFox usw. zugreifen, nach dem Schema:
Delphi-Quellcode:
MeinArray[X][Y].EineMethodeVonTFox(Wert, NochEinWert: Integer);
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:
Delphi-Quellcode:
SelectedRabbit^ := Habitat.WorldArray[i][j] as TRabbit;
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?

Luckie 3. Apr 2004 13:10

Re: Über Hauptklasse auf Unterklasse zugreifen? Greift hier
 
Eventuell hilft dir das weiter:
http://www.luckie-online.de/Tutorials/ -> Das Klassen Tutorial.

Nonsense 3. Apr 2004 13:18

Re: Über Hauptklasse auf Unterklasse zugreifen? Greift hier
 
Zitat:

Zitat von Luckie
Eventuell hilft dir das weiter:
http://www.luckie-online.de/Tutorials/ -> Das Klassen Tutorial.

Habe mal dein Beispiel ausprobiert, klappt aber irgendwie nicht:
Delphi-Quellcode:
(Habitat.WorldArray[i][j] as TRabbit).DoMove;
Dein Beispiel: (MyFruit as TcitrusFruit).Squeeze

Nonsense 3. Apr 2004 13:21

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!

Phoenix 3. Apr 2004 13:58

Re: Über Hauptklasse auf Unterklasse zugreifen? Greift hier
 
Zitat:

Zitat von Nonsense
Delphi-Quellcode:
SelectedRabbit^ := Habitat.WorldArray[i][j] as TRabbit;

Ich würde - einfach zur Scierheit und zur Wartbarkeit - hergehen und folgendes machen:
Delphi-Quellcode:
if (Habitat.WorldArray[i][j] is TRabbit) then
   SelectedRabbit^ := Habitat.WorldArray[i][j] as TRabbit;
Ansonsten kann es sein, daß Du ein TFox da reinpackst und ich weiss nicht, was eine Hase macht, wenn man ihm am Fuchsschwanz packt ;-)

Chewie 3. Apr 2004 14:50

Re: Über Hauptklasse auf Unterklasse zugreifen? Greift hier
 
Oder performanter:

Delphi-Quellcode:
if (Habitat.WorldArray[i][j] is TRabbit) then
   SelectedRabbit^ := TRabbit(Habitat.WorldArray[i][j]);
as ruft schon is auf, deswegen reicht hier ein einfacher Cast.

Außerdem: Was soll SelectedRabbit^? Wenn SelectedRabbit vom Typ TRabbit ist, was ich annehme, brauchst du keine Dereferenzierung!

Nonsense 3. Apr 2004 16:22

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 00:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz