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 Forward Problem (https://www.delphipraxis.net/46948-klassen-forward-problem.html)

Master_BB 3. Jun 2005 13:41


Klassen Forward Problem
 
Hallo,
ich habe derzeit das Problem das ich eine Unit voller Objekte habe.
Oben habe ich eine Liste mit den Objekten.
Die sieht so aus
Delphi-Quellcode:
  TContentItem    = class;
  ...             = class;
  TInterface      = class;
  .................= class;
  .................= class;
  TRegOperations  = class;
  TRootObj        = class;
  TServerFileItem = class;
  TServerInterface = class;
  TSynchronizer   = class;
und jetzt ist das problem das ich TInterface von TRootObj ableiten möchte.
Da aber in der reihenfolge zum zeitpunkt von TInterface - TRootobj noch nicht
bekannt ist sagt er mir das ich TRootObj nicht ausreichend deklariert habe.

ich kann ich jetzt vor TInterface einen Forward anbringen auf die TRootObj Klasse?

TRootObj = class forward;
funktioniert nicht.

wenn mir da jemand schnell helfen könnte wäre das sehr hilfreich

sakura 3. Jun 2005 14:19

Re: Klassen Forward Problem
 
Eigentlich ganz einfach:
Delphi-Quellcode:
type
  TSpaeter = class;

  TJetzt = class
  public
    FSpaeter: TSpeater;
  end;

  TSpaeter = class
  public
    procedure HelloWorld;
  end;
...:cat:...

Master_BB 3. Jun 2005 15:59

Re: Klassen Forward Problem
 
nein ihc habe oben eine alphabetisch sortierte Objekt liste
und darunter in der ordnung die ausgeschriebenen objekte.
und das soll auch so bleiben

Dax 3. Jun 2005 16:05

Re: Klassen Forward Problem
 
Entwerder wie von sakura vorgeschlagen - oder gar nicht. Wenn du keine Forwarddeklarationen haben willst, nimm einen C-Sprache ;)

Robert_G 3. Jun 2005 19:33

Re: Klassen Forward Problem
 
Zitat:

Zitat von Dax
Entwerder wie von sakura vorgeschlagen - oder gar nicht.

Es geht auch ohne dass man sich 5 mio Zeilen in einer Unit antut. :kotz:
Und zwar mit Hilfe von Interfaces bzw. abstrakten Klassen.
Bei dem Ansatz ist es weniger schlimm, dass du bei so vielen Kreuzverweisen alles in eine Unit quetschen musst.
Interfaces haben nunmal keine Implementierung ;) Aber ein langsamer und fummeliger Prozess wird es auf jeden Fall werden. :?
Zitat:

Zitat von Dax
Wenn du keine Forwarddeklarationen haben willst, nimm einen C-Sprache ;)

Es gibt auch ein Pascal mit einem modernen Compiler. :)

Robert_G 4. Jun 2005 23:34

Re: Klassen Forward Problem
 
Zitat:

Zitat von Master_BB
nein ihc habe oben eine alphabetisch sortierte Objekt liste
und darunter in der ordnung die ausgeschriebenen objekte.

Objekte oder Klassen? :gruebel: :zwinker:
Zitat:

Zitat von Master_BB
und das soll auch so bleiben

Bist du dir da sicher?
Wenn du von ein paar deiner Klassen den Interface teil rausrückst, wäre die Chance relativ hoch, dass ich Lust verspüren könnte dir ein paar Beispiele zu geben. (man beachte den Konjunkiv :mrgreen: )
Man gewinnt immens an Übersicht und löst die selbst auferlegten Fesseln, wenn man Klassen nicht so fest miteinander verbindet.
Über Interfaces lässt sich diese Entkoppelung auflockern/lösen und dass in 90% aller Fälle ohne auch nur einen einzigen Typecast zu brauchen. ;)

Das hier gilt unverändert weiterhin...
Zitat:

Zitat von Robert_G
Aber ein langsamer und fummeliger Prozess wird es auf jeden Fall werden. :?

...aber vielleicht wird es mit etwas Anfahrhilfe weniger fummelig und schneller?

Master_BB 5. Jun 2005 09:27

Re: Klassen Forward Problem
 
hm den interface teil möchtest du nicht haben,
der ist recht laaaanng. desweiteren denke ich
darf ich es bestimmt auch nicht da dies ein praktikums
projekt von mir ist. im endeffekt hilft das auch nicht.
ich glaube auhc das ihr nicht richtig verstanden habt vieleicht
wegen meiner schlechten formulierung was ich meinte.
ein beispiel ist

ich habe ein Objekt
-darin befindet sich ein eigenes tnotify
-und dieses TMyNotify muss ja jetzt vor
dem objket im interface deklariert sein sonst sagt der compiler
findet er nicht.
-so jetzt will ich aber da bei mir das sich um ein
objekt handelt anstatt des TMyNotify Types das ich
dieses Objekt trotzdem darunter pack.

Delphi-Quellcode:
TMyNotify = procedure(Bla : string) of object;

TBla = class
private
protected
public
  property MyNotify : TMyNotify read ... write ...
end;

//HIER HIN
da ich ja eine alphabetische ordnung bei den objekten
besitze und zwecks code sauberkeit auch berhalten möchte.
das hieße man müßte irgentwie forwarden.
bei routinen gehts wohl so

Delphi-Quellcode:
procedure bla; forward;
wenn ich jetzt mein objekt darunter aufbau wo ich diese routine benutze dann
ist sie ihm bekannt auch wenn sie erst nach dem objekt nocheinmal richtig aufgeführt ist.
und so möchte ich das halt mit objekten.

Delphi-Quellcode:
TAlpah = class(TBeta)
...
end;

TBeta = class
...
end;
hier sieht man jetzt durch die alphabetische ordnung
kommt alpah zuerst obwohl es von TBeta abgeleitet
ist. und diese konstruktion macht auch im compiler
probleme da zum zeitpunkt wo er über TAlpha läuft er
TBeta noch garnicht kennt. somit müßte man
das ja so in etwa machen.

Delphi-Quellcode:
TBeta forward;

TAlpah = class(TBeta)
...
end;

TBeta = class
...
end;
hatte dieses problem noch niemand?

[edit=alcaeus]Delphi-Tags an mehreren Stellen eingefuegt. Beim naechsten Mal bitte selbst machen. Mfg, alcaeus[/edit]

jfheins 5. Jun 2005 09:34

Re: Klassen Forward Problem
 
Also, es geht so:
Delphi-Quellcode:
  TBeta = class;

  TAlpha = class
    Data2: TBeta;
  end;

  TBeta = class
    Data: Integer;
  end;
Oder du verzichtest einfach auf eine alphabetische Sortierung ...

:wall:

Master_BB 5. Jun 2005 10:25

Re: Klassen Forward Problem
 
hm das ist ja das problem solch eine objektliste
hab ich ja davor

Delphi-Quellcode:
TContentItem    = class;
  ...             = class;
  TInterface      = class;
  .................= class;
  .................= class;
  TRegOperations  = class;
  TRootObj        = class;
  TServerFileItem = class;
  TServerInterface = class;
  TSynchronizer   = class;
die die ich angegeben hatte am anfang und dennoch kommt das
problem.

alcaeus 5. Jun 2005 10:42

Re: Klassen Forward Problem
 
Hallo MasterBB,

hier mal das, was ich auf die Schnelle rausgefunden habe. Hier mal ein Beispiel das nicht funktioniert (D7):
Delphi-Quellcode:
TBar = class;
TFoo = class;

TFoo = class(TBar) //<-- Fehler hier
end;

TBar = class(TObject)
   FFoo: TFoo;
end;
Der Fehler "Class TBar is not yet completely defined" tritt in der markierten Zeile auf. Ich kann es mir nur damit erklaeren, dass ich nicht von einer nicht vollstaendig deklarierten Klasse ableiten kann. Dieses Beispiel funtioniert naemlich:

Delphi-Quellcode:
TBar = class;
TFoo = class;

TBar = class(TObject)
   FFoo: TFoo;
end;

TFoo = class(TBar)
end;
Wiederum sind die Klassen alphabetisch forward-deklariert, aber die engueltige Deklarationsreihenfolge ist umgekehrt. Versuch das mal zu beruecksichtigen. Du musst auch bei der endgueltigen Deklaration eine gewisse Reihenfolge einhalten, aber ich wuerde versuchen es so zu machen, dass ich keine forward declares brauche :wall:

Greetz
alcaeus


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:55 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