Einzelnen Beitrag anzeigen

Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Unit-übergreifende Vorwärtsdeklaration von Klassen?

  Alt 23. Apr 2010, 19:16
Hallo TOC,

zunächst solltest du versuchen, die Abhängigkeiten zwischen den Klassen so weit wie möglich aufzulösen. Je komplexer deine Applikation wird, desto schwieriger wird es mit dieser Struktur, Fehler zu finden und einzelne Klassen zu testen.

Falls du an der Struktur festhalten möchtest oder musst, gibt es folgende Möglichkeiten:

a) "weak" pointer - Bei der Definition werden die Verweise als TObject vereinbart, in der Implementierung sind dann Typecasts notwendig. Das Problem dabei ist, dass du die Typenprüfung des Compilers umgehst und sich sich auf diese Weise weitere Fehler einschleichen können.

b) Interfaces - Neben dem oft zu vernachlässigenden Performanceverlust können bei Kreuzreferenzen Memoryleaks auftreten. Wenn sich zwei Instanzen über Interface-Variablen gegenseitig referenzieren, kann keine der Instanzen automatisch freigegeben werden.

c) Abstrakte Klassen:

Delphi-Quellcode:
Unit Common;
interface

type
  TAbstractClass1 = class
  public
    procedure Foo1; virtual; abstract;
  end;
  
  TAbstractClass2 = class
  public
    procedure Foo2; virtual; abstract;
  end;
  
  TAbstractClass3 = class
  public
    procedure Foo3; virtual; abstract;
  end;

implementation
end.


Unit Unit1;
interface
uses Common;

type
  TClass1 = class (TAbstractClass1)
  private
    FClass2: TAbstractClass2;
  public
    procedure Foo1; override;
  end;
  
implementation
uses Unit2;
end.


Unit Unit2;
interface
uses Common;

type
  TClass2 = class (TAbstractClass2)
  private
    FClass1: TAbstractClass1;
    FClass3: TAbstractClass3;
  public
    procedure Foo2; override;
  end;
  
implementation
uses Unit1, Unit3;
end.


Unit Unit3;
interface
uses Common;

type
  TClass3 = class (TAbstractClass3)
  private
    FClass1: TAbstractClass1;
    FClass2: TAbstractClass2;
  public
    procedure Foo3; override;
  end;
  
implementation
uses Unit1, Unit2;
end.
Man kann solche Strukturen auf die gezeigte Weise aufbrechen, ob es in deinem Fall aber die beste Lösung darstellt, ist aufgrund des gezeigten Quelltextes schwer zu beurteilen.

Gruß Hawkeye
  Mit Zitat antworten Zitat