![]() |
Klassen-Querverweise
Hallo,
ich habe 2 Klassen, welche jeweils eine Membervariable der anderen Klassen haben. Wie kann ich die beiden Klassen so deklarieren, da dieser "Querverweis" möglich ist? Bisher bekomme ich in der Klasse die als erstes steht, logischweise, eine Fehlermeldung "Undefinierter Bezeichner" beim dekalieren der Variable des Typs von der anderen Klassen... mfG mirage228 |
Re: Klassen-Querverweise
Hallo,
das geht so:
Delphi-Quellcode:
Type
TMyObject 2 = class; TMyObject 1 = class ... property MyObject2 : TMyObject2 ... ... TMyObject2 = class ... property MyObject1 : TMyObject1 ... ... |
Re: Klassen-Querverweise
So lange du beide Klassen in einer Unit hast, kannst du forward Klassen benutzen:
Delphi-Quellcode:
type
TMyClass = class; TMySecondClass = class; TMyClass = class(TXy) FSecond: TMySecondClass; end; TMySecondClass = class(TAb) FFirst: TMyClass; end; |
Re: Klassen-Querverweise
Danke Leute. Beides funktioniert einwandfrei.
MfG mirage228 |
Re: Klassen-Querverweise
Hallo
Zitat:
|
Re: Klassen-Querverweise
Zitat:
Kann mal jemand jgb's Beitrag so abändern, dass er mit "Wenn du allerdings nicht beide Klassen in einer Unit hast, ..." anfängt? |
Re: Klassen-Querverweise
Zitat:
Wenn du ohne abstrakte Vorgänger/Interfaces arbeiten willst bräuchtest du einen multipass compiler. (wie in Java, C#, Chrome,...) |
Re: Klassen-Querverweise
c# verwöhnt! ;)
ist der langen rede kurzer sinn "nein"? |
Re: Klassen-Querverweise
Zitat:
In eine Unit packst du nur die voneinander abhängigen Interfaces oder auch abstrakte Klassen, deren Nachfolger du dann in einzelne Dateien packen kannst. So mache ich es jedenfalls meistens. (Ich hasse es wenn Units größer als 1-2 Bildschirme werden. ;) ) Und aus lauter Faulheit ein Beispiel zu tippen (was du bestimmt gleich erfragen würdest. :mrgreen: ) ![]() |
Re: Klassen-Querverweise
wie sähe es bei folgendem beispiel aus?
Delphi-Quellcode:
unit uTest;
interface uses uTest2 type Parent = class fChild : Child; end; implementation end.
Delphi-Quellcode:
unit uTest2;
interface uses uTest; type Child = class fPartent : Parent; end; implementation end. |
Re: Klassen-Querverweise
Zirkuläre Referenz. Der Compiler knallt dir das ins Gesicht und verabschiedet sich ;)
|
Re: Klassen-Querverweise
Und wenn ich das aber so haben will?
|
Re: Klassen-Querverweise
Wollen :roll: Du darfst nicht, das ist definiert ;) Versuch mal das zu kompilieren, wie du auch tust, es wird nicht gehen ^^ Gänge es, würde sich der Compiler in einer Endlosschleife verfangen.
|
Re: Klassen-Querverweise
Es gibt noch zwei - nicht besonders schöne, aber dennoch funktionierende Möglichkeiten:
- TypeCasts:
Delphi-Quellcode:
- über ne (globale) Variable auf die anderen Klassen zugreifen:
Parent: TObject;
implementation uses ParenTUnit; procedure DoSomething; begin (Parent as TParent).Irgendwas := 0; end;
Delphi-Quellcode:
Letzterses funktioniert aber nur, wenn du nur eine Instanz deiner Referenzierten Klasse hast. Alles andere wird mit der Zeit unübersichtlich.
unit Main_class
MainClass = class(TObject) private FParent: TParent; FChild: TChild; public <entsprechende properties>; ... unit MainForm_U; var Form1: Form1; MainClass: TMainClass; unit Child_class TParent = class(TObject) ... procedure DoSomething; begin MainClass.Parent.Irgendwas := 0; end; mfg Christian |
Re: Klassen-Querverweise
das erstere (mit dem Typecast) sieht zwar schrecklich aus und zerbricht das saubere Konzept, aber es wird wohl das einfachste sein.
Zitat:
|
Re: Klassen-Querverweise
Zitat:
btw: Das Beispiel in dem anderen Thread hat anscheinend einen Bug im D2005 Komposter gefunbden. :mrgreen: |
Re: Klassen-Querverweise
irgendwo hast du recht. aber andererseits ist es auch wieder sau kompliziert!
|
Re: Klassen-Querverweise
Zitat:
|
Re: Klassen-Querverweise
ich werde jetzt erstmal testen, ob es nicht reicht, die variable im interface als TObject zu deklarieren und dann in der implementation auf den jeweiligen objekttyp zu casten.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:14 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