Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Klassen-Querverweise (https://www.delphipraxis.net/13541-klassen-querverweise.html)

mirage228 20. Dez 2003 18:34


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

Jens Schumann 20. Dez 2003 18:37

Re: Klassen-Querverweise
 
Hallo,
das geht so:

Delphi-Quellcode:
Type
 
 TMyObject 2 = class;
 
 TMyObject 1 = class
 ...
 property MyObject2 : TMyObject2 ...
 ...
 
 TMyObject2 = class
 ...
 property MyObject1 : TMyObject1 ...
 ...

jbg 20. Dez 2003 18:43

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;

mirage228 20. Dez 2003 19:06

Re: Klassen-Querverweise
 
Danke Leute. Beides funktioniert einwandfrei.

MfG
mirage228

Jens Schumann 20. Dez 2003 19:10

Re: Klassen-Querverweise
 
Hallo
Zitat:

Zitat von mirage228
Beides funktioniert einwandfrei.

kein Wunder. Ist ja auch zweimal der gleiche Vorschlag.

nailor 9. Jun 2005 17:57

Re: Klassen-Querverweise
 
Zitat:

Zitat von jbg
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;

*uralten Thread auskram*, aber es ist genau meine Frage!

Kann mal jemand jgb's Beitrag so abändern, dass er mit "Wenn du allerdings nicht beide Klassen in einer Unit hast, ..." anfängt?

Robert_G 9. Jun 2005 18:03

Re: Klassen-Querverweise
 
Zitat:

Zitat von nailor
Kann mal jemand jgb's Beitrag so abändern, dass er mit "Wenn du allerdings nicht beide Klassen in einer Unit hast, ..." anfängt?

C#-verwöhnt?
Wenn du ohne abstrakte Vorgänger/Interfaces arbeiten willst bräuchtest du einen multipass compiler. (wie in Java, C#, Chrome,...)

nailor 9. Jun 2005 18:09

Re: Klassen-Querverweise
 
c# verwöhnt! ;)

ist der langen rede kurzer sinn "nein"?

Robert_G 9. Jun 2005 18:31

Re: Klassen-Querverweise
 
Zitat:

Zitat von nailor
c# verwöhnt! ;)

ist der langen rede kurzer sinn "nein"?

Hübsch wird's nicht werden aber es geht halbwegs...
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: )
Hier habe ich letztlich etwas Code hochgeladen, der so strukturiert sein sollte. ;)

nailor 9. Jun 2005 19:10

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.

Dax 9. Jun 2005 19:27

Re: Klassen-Querverweise
 
Zirkuläre Referenz. Der Compiler knallt dir das ins Gesicht und verabschiedet sich ;)

nailor 9. Jun 2005 19:32

Re: Klassen-Querverweise
 
Und wenn ich das aber so haben will?

Dax 9. Jun 2005 19:33

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.

r2c2 9. Jun 2005 19:50

Re: Klassen-Querverweise
 
Es gibt noch zwei - nicht besonders schöne, aber dennoch funktionierende Möglichkeiten:

- TypeCasts:
Delphi-Quellcode:
Parent: TObject;

implementation

uses
  ParenTUnit;

procedure DoSomething;
begin
  (Parent as TParent).Irgendwas := 0;
end;
- über ne (globale) Variable auf die anderen Klassen zugreifen:

Delphi-Quellcode:
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;
Letzterses funktioniert aber nur, wenn du nur eine Instanz deiner Referenzierten Klasse hast. Alles andere wird mit der Zeit unübersichtlich.

mfg

Christian

nailor 9. Jun 2005 20:40

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:

Zitat von Dax
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.

eben deshalb frage ich ja, WIE ich es machen kann.

Robert_G 9. Jun 2005 20:56

Re: Klassen-Querverweise
 
Zitat:

Zitat von nailor
eben deshalb frage ich ja, WIE ich es machen kann.

Ich habe oben ein Beispiel angeboten, keine Ahnung warum du lieber nzig-mal fragst anstatt einmal zu lesen... :gruebel:

btw: Das Beispiel in dem anderen Thread hat anscheinend einen Bug im D2005 Komposter gefunbden. :mrgreen:

nailor 9. Jun 2005 21:00

Re: Klassen-Querverweise
 
irgendwo hast du recht. aber andererseits ist es auch wieder sau kompliziert!

Robert_G 9. Jun 2005 21:04

Re: Klassen-Querverweise
 
Zitat:

Zitat von nailor
irgendwo hast du recht. aber andererseits ist es auch wieder sau kompliziert!

Dann stelle spezifische Fragen, vielleicht kommen sogar spezifische Antworten. ;)

nailor 9. Jun 2005 21:08

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