Array der eigenen Klasse als Result oder Property

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Array der eigenen Klasse als Result oder Property

Beitrag von compmgmt »

Hallo allerseits,
erstmal zur Theorie. Mir ist absolut bewusst dass man ein Array nicht als Result übergeben kann, einen Typ allerdings schon. Das folgende ist möglich:

Code: Alles auswählen

type
  TIntArray = array of Integer;
...
function a: TIntArray;

Jetzt zu meinem Problem: Ich habe eine Klasse, welche sich selbst enthalten kann und möchte dies als Funktionsergebnis angeben. Hier mal zur Veranschaulichung ein Beispiel:

Code: Alles auswählen

type
  TMyClass = class
    private
      FItems: array of TMyClass;
    public
      function GetItems(OtherInformations: String): array of TMyClass;
  end;

Ich habe schon folgende Ideen gehabt/folgendes probiert:
1. TObjectArray = array of TObject (bzw die Elternklasse, wenn es nicht direkt TObject ist) stattdessen zu nehmen, wobei ich diese Möglichkeit als nicht schön finde und ein rekursives Ausgeben der Items durch casten umständlich gemacht wird. Sollte es keine Lösung für dieses Problem geben werde ich es eben so machen.
2. TArray spezialisieren, wobei das nicht funktioniert da ich ja auch erst einen Typ erstellen muss.

Habt ihr irgendwelche Ideen?

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Array der eigenen Klasse als Result oder Property

Beitrag von Warf »

Was du suchst sind foreword deklarationen

Code: Alles auswählen

TMyClass = class; // foreword dekl
 
TArrayType = Array  of TMyClass; // benutze foreword dekl
 
TMyClass =class // richtige Definition
//...
Arr: TArrayType;
End;


Ps: bin am Handy also nicht über Tippfehler wundern

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Array der eigenen Klasse als Result oder Property

Beitrag von compmgmt »

Danke Warf, an forward Deklarationen hab ich gar nicht gedacht. Hab sie bisher noch nie benötigt.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Array der eigenen Klasse als Result oder Property

Beitrag von Socke »

Du kannst auch in Klassen Typen definieren:

Code: Alles auswählen

type
TMyClass = class(TObject)
public type
  TMyClassArray = array of TMyClass;
public
  function GetResult: TMyClass.TMyClassArray;
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Array der eigenen Klasse als Result oder Property

Beitrag von braunbär »

Hat den Nachteil, dass du solche Typen außerhalb von Methoden dieser Klasse immer als Klassenname.Typbezeichnung ansprechen musst.

Innerhalb der Klasse aber nicht, du kannst also schon schreiben

Code: Alles auswählen

 
type
TMyClass = class(TObject)
public type
  TMyClassArray = array of TMyClass;
public
  function GetResult: TMyClassArray;
end;
 
 

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: Array der eigenen Klasse als Result oder Property

Beitrag von wp_xyz »

Socke hat geschrieben:Du kannst auch in Klassen Typen definieren

Schade, dass die klare Struktur der Sprache Pascal durch solche Modeerscheinungen immer mehr verwässert wird.

Warf
Beiträge: 1909
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Array der eigenen Klasse als Result oder Property

Beitrag von Warf »

Schade, dass die klare Struktur der Sprache Pascal durch solche Modeerscheinungen immer mehr verwässert wird.


Pascal könnte von Anfang an nested Funktionen. Warum also nested Typen gegen den Stil von Pascal verstoßen sollten ist mir unklar. Ist doch das selbe Prinzip

Außerdem kann man sogar Typen innerhalb von Funktionen definieren (soweit ich weiß auch von Anfang an in pascal). Was im Vergleich zu dem was es schon immer gab, so schlimm an den nested Typen sein soll versteh ich beim besten Willen nicht

Mal ganz davon abgesehen das generische Typen ohne nested Typen in vielen Situationen recht witzlos wäre

Antworten