Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zirkulärer Bezug bei Units und Objekten (https://www.delphipraxis.net/146980-zirkulaerer-bezug-bei-units-und-objekten.html)

KPBecker 30. Jan 2010 11:57


Zirkulärer Bezug bei Units und Objekten
 
Hallo, Delphi-Praktiker,
ich habe folgendes Problem, hier dargestellt am Beispiel eines Fischteichs:

Gegeben: Die Klassen TFisch, TFischListe und TTeich, jeweils in eigenen Units

Delphi-Quellcode:
unit UFisch

interface

type
  TFisch = class(TObject)
    Art:    String;
    Gewicht: Integer;
  end;
Delphi-Quellcode:
unit UFischListe;

interface

uses Contnrs, UFisch;

type
  TFischListe = class(TObjectList)
    // Hier überschreibe ich noch die entsprechenden Methoden von TObjectList, dass alle Elemente vom Typ TFisch sind
  end;
Delphi-Quellcode:
unit UTeich;

interface

uses UFischListe;

type
  TTeich = class(TObject)
    Laenge: Integer;
    Breite: Integer;
    Hoehe: Integer;

    Fische: TFischListe;
  end;
Jetzt sollen meine Fische aber mehr können, zum Beispiel andere Fische fressen. Dafür muss ein Fisch aber irgendwie auf die anderen Fische im Teich zugreifen können. Wie kann ich das machen? Wenn ein Fisch alle anderen Fische im Teich kennen soll, muss er ja auf den Teich zugreifen können. Dann aber löse ich ärgerlicherweise einen zirkulären Bezug aus:
Delphi-Quellcode:
unit UFisch

interface

uses UTeich; //<-- Hier kommt es zu einem zirkulären Bezug!

type
  TFisch = class(TObject)
    Art:    String;
    Gewicht: Integer;
   
    Teich: TTeich; //<-- Hier kommt es zu einem zirkulären Bezug!
  end;

Viele Grüße
Klaus-Peter

mkinzler 30. Jan 2010 11:58

Re: Zirkulärer Bezug bei Units und Objekten
 
Binde die anderen Units im Implementationsteil ein

KPBecker 30. Jan 2010 12:33

Re: Zirkulärer Bezug bei Units und Objekten
 
Hallo Markus,
das geht leider nicht. Die Unit muss im uses des interface-Abschnitts stehen, wenn ich sie in meiner Typ-Deklaration verwenden möchte.

Delphi-Quellcode:
unit UFisch;

interface

type
  TFisch = class(TObject)
    Art:    String;
    Gewicht: Integer;

    Teich: TTeich; //Hier kennt er TTeich nicht, weil UTeich nicht im interface-Abschnitt eingebunden wurde
  end;

implementation

uses UTeich;
Und andersherum geht es auch nicht, weil TTeich TFisch (bzw. TFischListe s. oben) braucht...

Klaus-Peter

sx2008 30. Jan 2010 15:16

Re: Zirkulärer Bezug bei Units und Objekten
 
Ich würde TFisch, TFischListe und TTeich in die gleiche Unit setzen.
Dann kann man eine "Forward Declaration" ansetzen:
Delphi-Quellcode:
type
  TFisch = class; // "es gibt eine Klasse TFisch; Genaueres folgt weiter unten"
  TFischListe = class;
  TTeich = class;

  TFisch = class(TObject)
    Art:    String;
    Gewicht: Integer;
    Teich: TTeich;
... end;

KPBecker 31. Jan 2010 10:24

Re: Zirkulärer Bezug bei Units und Objekten
 
Vielen Dank, sx2008. Es funktioniert wunderbar!
Klaus-Peter


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