Vorwärts Deklaration einer abgeleiteten Klasse

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Vorwärts Deklaration einer abgeleiteten Klasse

Beitrag von hubblec4 »

Hi

Ich wollte mal fragen ob so eine vorwärts Deklaration möglich ist.


Normalerweise geht das ja so

Code: Alles auswählen


TKlasse2 = class;

TKlasse1 = class
 private
  FK2: TKlasse2;
end;

TKlasse2 = class
 private
  FK1: TKlasse1;
end;


Nun ist es aber so das Klasse 2 von einer Basis-Klasse abgeleitet wird

Code: Alles auswählen

TKlasse2 = class(BasisKlasse); // das geht leider nicht

TKlasse1 = class
 private
  FK2: TKlasse2;
end;

TKlasse2 = class(BasisKlasse);
 private
  FK1: TKlasse1;
end;


Gibts da dennoch einen weg?

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Vorwärts Deklaration einer abgeleiteten Klasse

Beitrag von m.fuchs »

Bei der Vorwärtsdeklaration darf noch keine Elternklasse angegeben werden:

Code: Alles auswählen

type
  TBasisKlasse = class(TObject)
  end;

  TKlasse2 = class;

  TKlasse1 = class(TObject)
    private
      FK2: TKlasse2;
  end;

  TKlasse2 = class(TBasisKlasse)
    private
      FK1: TKlasse1;
  end;
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Vorwärts Deklaration einer abgeleiteten Klasse

Beitrag von marcov »


hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: Vorwärts Deklaration einer abgeleiteten Klasse

Beitrag von hubblec4 »

m.fuchs hat geschrieben:
Fr 26. Mär 2021, 13:34
Bei der Vorwärtsdeklaration darf noch keine Elternklasse angegeben werden:

Ja das dachte ich mir schon und merkt man ja auch.
In meinem/deinem kleinen Beispiel funktioniert das ja dann auch soweit.

Das Problem ist aber das ich kurz nach der Klassen-Vordefinition auf diese Klasse zugreife/verwende und da kommt dann eine Fehlermeldung, da ja der "Elternteil" von der Basisklasse fehlt.

TKlasse2 = class; ist eben nicht das gleiche wie TKlasse2 = class(BasisKlasse).

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Vorwärts Deklaration einer abgeleiteten Klasse

Beitrag von m.fuchs »

hubblec4 hat geschrieben:
Di 30. Mär 2021, 13:32
Das Problem ist aber das ich kurz nach der Klassen-Vordefinition auf diese Klasse zugreife/verwende und da kommt dann eine Fehlermeldung, da ja der "Elternteil" von der Basisklasse fehlt.
TKlasse2 = class; ist eben nicht das gleiche wie TKlasse2 = class(BasisKlasse).
Hm, auch wenn du die Klasse TKlasse2 erst später fertig definierst, so ist doch ihr Interface dann bekannt. Und du kannst letztendlich im Implementationsteil komplette darauf zugreifen.

Code: Alles auswählen

program Project1;
{$MODE ObjFpc}
{$H+}

uses
  Classes;

type
  TBasisKlasse = class(TObject)
    private
      procedure Test;
  end;

  TKlasse2 = class;

  TKlasse1 = class(TObject)
    private
      FK2: TKlasse2;
    public
      constructor Create;
      destructor Destroy; override;
      procedure TestFK2;
  end;

  TKlasse2 = class(TBasisKlasse)
    public
      procedure Test2;
  end;

procedure TKlasse2.Test2;
begin
  WriteLn('Test2');
end;

constructor TKlasse1.Create;
begin
  inherited Create;
  FK2 := TKlasse2.Create;
end;

destructor TKlasse1.Destroy;
begin
  FK2.Free;
  inherited Destroy;
end;

procedure TKlasse1.TestFK2;
begin
  FK2.Test;
  FK2.Test2;
end;

procedure TBasisKlasse.Test;
begin
  WriteLn('Test');
end;

var
  x: TKlasse1;

begin
  x := TKlasse1.Create;
  x.TestFK2;
end.
Oder missverstehe ich einfach dein Problem?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: Vorwärts Deklaration einer abgeleiteten Klasse

Beitrag von hubblec4 »

m.fuchs hat geschrieben:
Di 30. Mär 2021, 20:35
Oder missverstehe ich einfach dein Problem?
Ja, die TKlasse2 ist ja auch von der BasisKlasse abgeleitet,
daher geht eben die einfache definition nicht.

Und ich muss/will ja nicht erst im Implementationsteil drauf zugreifen sondern schon vorher.

Wie gesagt es compiliert nicht da ich eben nicht TKlasse2 = class(BasisKlasse); vordefinieren kann.

Es gibt die
TBasisKlasse = class

end;

und dann habe ich noch folgendes
TBasisKlasseClass = class of TBasisKlasse;


und dann gibts da ein array
TKlassenArray = array[0..10] of TBasisKlasseClass
dieses array ist const und wird vordefiniert/belegt.

Und wenn ich da jetzt die TKlasse2 reinhaue geht das nicht weil TKlasse2 bei vordefinieren nicht mit dem Elternteil vordefiniert werden kann.

Antworten