Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi "übergeordnetes" Object ansprechen (https://www.delphipraxis.net/55923-uebergeordnetes-object-ansprechen.html)

LuckyLucas 28. Okt 2005 22:02


"übergeordnetes" Object ansprechen
 
Heyho,

also: Ich habe eine Unit mit einer Klasse. Diese besitzt die Property einer Klasse, die ich in einer anderen Unit untergebracht habe. Nun möchte ich in der "zweiten" Klasse in einer Procedure auf eine Property einer Instanz der "ersten" Klasse zugreifen. Wie tue ich das? U.a. gibt es dann irgendwie Problem mit zirkuläre Referenz... Bsp. (was ich möchte):

"UnitBaum":
Delphi-Quellcode:
uses
  UnitAst
type TBaum=class(TObject)
  public
    property EinAst: TAst;
    property Baum_hat_Schaden: boolean;
...
"UnitAst":
Delphi-Quellcode:
uses
  UnitBaum // ???
type TAst=class(TObject)
  public
    procedure Ast_abbrechen;
...
  procedure TAst.Ast_abbrechen;
  begin
    Breche_Ast_ab;
    MyBaum.Baum_hat_Schaden := true;
  end;
...
Und in meiner MainUnit create ich ein Object von TBaum (MyBaum), sodass ich dann aus der MainUnit heraus nur "Ast_abbrechen" aufrufen brauche, und nicht noch zusätzlich für ein Object von TBaum extra "MyBaum.Baum_hat_Schaden := true" aufrufen muss. Ist praktisch ein Ereignis auf "Ast_abbrechen" ???

Ist das einigermaßen verständlich, wo ich nicht so durchsehe? Da ich selber grad nich so durchsehe, kanns auch sehr unverständlich sein :?

xaromz 28. Okt 2005 22:35

Re: "übergeordnetes" Object ansprechen
 
Hallo,

für Dein Problem gibt es eigentlich nur drei Möglichkeiten.
Erstens: Du packst alles in eine Unit.
Zweitens: Du deklarierst das Ganze so:
Delphi-Quellcode:
unit
  UnitAst;

type TAst=class(TObject)
  public
    MyBaum: TObject;
    procedure Ast_abbrechen;
...

implementation

uses
  UnitBaum;

  procedure TAst.Ast_abbrechen;
  begin
    Breche_Ast_ab;
    TBaum(MyBaum).Baum_hat_Schaden := true;
  end;
Drittens: Du entwirfst Deine Objekte als Interfaces und deklarierst beide in einer Datei (das läuft dann auf eine Art Header-File hinaus: Deklaration und Implementierung in verschiedenen Dateien). So kannst Du die beiden Objekte in getrennten Unit belassen und greifst nur noch über die Deklaration darauf zu.

Gruß
xaromz

SirThornberry 28. Okt 2005 22:49

Re: "übergeordnetes" Object ansprechen
 
Die gegenseite Einbindung könntest du damit lösen das du die beiden Klassen in eine Unit implementierst. Dabei musst du nicht zwangsläufig auch die Methoden in der gleichen Unit haben. Du könntest für beide Klassen (die in verschiedenen Units sind) jeweils eine Basisklasse machen mit abstrakten Methoden und diese Methoden überschreibst du dann in den entsprechenden einzelnen Units:
Unitx:
Delphi-Quellcode:
[...]
type
  TBasisKlasse2 = class;

  TBasisKlasse1 = class(TObject)
  public
    RefToClass2: TBasisKlasse2;
    procedure MethodeVonKlasse1; abstract;
  end;

  TBasisKlasse2 = class(TObject)
  public
    RefToClass1: TBasisKlasse1;
    procedure MethodeVonKlasse2; abstract;
  end;
Unit Klasse1:
Delphi-Quellcode:
[...]
uses Unitx;
[...]
type
  TKlasse1 = class(TBasisKlasse1)
  public
    procedure MethodeVonKlasse1; override;
  end;
[...]
procedure TKlasse1.MethodeVonKlasse1;
begin
  if RefToClass2 <> nil then
    RefToClass2.MethodeVonKlasse2;
end;
Unit Klasse2:
Delphi-Quellcode:
[...]
uses Unitx;
[...]
type
  TKlasse2 = class(TBasisKlasse2)
  public
    procedure MethodeVonKlasse2; override;
  end;
[...]
procedure TKlasse2.MethodeVonKlasse1;
begin
  if RefToClass1 <> nil then
    RefToClass1.MethodeVonKlasse1;
end;
Durch das deklarieren der abstracten Methoden können also die einzelnen Klassen auch auf die Methoden der anderen Klassen zugreifen. Um die Übersichtlichkeit zu wahren kannst du natürlich auch die "unitX2" in 2 units aufspalten welche dann jeweils nur eine Basisklasse enthält.

LuckyLucas 30. Okt 2005 17:09

Re: "übergeordnetes" Object ansprechen
 
Der Einfachheit halber hab ich jetzt alles in eine Unit geschrieben, da die Methoden/Eigenschaften von der zweiten Klasse eh nicht so zahlreich sind.


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