Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Überkreuz-Referenz zw. Klassen (https://www.delphipraxis.net/168068-ueberkreuz-referenz-zw-klassen.html)

Nic2012 3. Mai 2012 10:08

Überkreuz-Referenz zw. Klassen
 
Ich habe in 1 Unit (D7) die 2 folgenden Klassen deklariert:
Code:
type
  TDevice = class
  public
    ipcon: TIPConnection;
  end;
type
  TIPConnection = class
  public
    devices: Array [0..255] of TDevice;
  end;
implementation
Das funktioniert so nicht, da TDevice die Klasse TIPConnection noch nicht kennt. Wie könnte man das lösen, aber die beiden Refrenzen behält ?

wicht 3. Mai 2012 10:10

AW: Überkreuz-Referenz zw. Klassen
 
Mit einer sogenannten Forward-Deklaration. Ich glaube jedenfalls, dass es so heißt:

Delphi-Quellcode:
type
  TIPConnection = class; // <<------

  TDevice = class
  public
    ipcon: TIPConnection;
  end;

  TIPConnection = class
  public
    devices: Array [0..255] of TDevice;
  end;
implementation
HTH

himitsu 3. Mai 2012 10:12

AW: Überkreuz-Referenz zw. Klassen
 
Zitat:

Zitat von wicht (Beitrag 1164692)
Forward-Deklaration

Jupp, nennt sich so.


Und zu beachten ist, daß es sich nur um einen Type-Block handelt.
Die Forward-Deklaration und die eigentliche Deklaration müssen Beide im selben Block stehen. (und demnach auch innerhalb der selben Unit)

Nic2012 3. Mai 2012 10:20

AW: Überkreuz-Referenz zw. Klassen
 
Danke, habs sofort umgesetzt und klappt prima.
Letzte Frage: Wie deklariere ich Konstanten, die z.B. nur für die Klasse TDevice gültig sein sollen ?

mkinzler 3. Mai 2012 10:37

AW: Überkreuz-Referenz zw. Klassen
 
Direkt nicht. Du kannst diese aber mit entsprechenden Prefixen versehen

himitsu 3. Mai 2012 12:18

AW: Überkreuz-Referenz zw. Klassen
 
Ab Delphi 2006 / Turbo Delphi, kann man Typen und Constanten innerhalb einer Klasse definieren.

Delphi-Quellcode:
type
  TMyClass = class
    const
      X = 3;
    type
      T = Byte;
  end;
Wegen der Übersichtlichkeit lege ich mir dafür aber jeweils eigene Sichtbarkeitsbereiche an
Delphi-Quellcode:
type
  TMyClass = class
  strict private const
    A = 'ganz geheim und nur für TMyClass';
  private const
    Z = 'abc';
  public const
    X = 666;
    Y = -7;
  private type
    TGeheim = record
      i: Integer;
      s: string;
    end;
  public
    constructor Create;
  end;
Intern als X nutzbar und extern als TMyClass.X (aber nur weil von außen sichbar, da Public)

shmia 3. Mai 2012 13:12

AW: Überkreuz-Referenz zw. Klassen
 
Bei gegenseitig referenzierenden Klassen sollte man versuchen den Konflikt durch Einführung einer weiteren Klasse aufzulösen:
Delphi-Quellcode:
type
  TIPConnection = class
  public
    property IP:TInAddr;
    property Port:Word;
  end;

  TDevice = class
  public
    ipcon: TIPConnection;
  end;

  TIPConnectionPool = class(TIPConnection)
  public
    devices: Array [0..255] of TDevice;
  end;


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