Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Alias (Interposer forward) für Generics (https://www.delphipraxis.net/203407-alias-interposer-forward-fuer-generics.html)

Rollo62 14. Feb 2020 08:58

Delphi-Version: 10.3 Rio

Alias (Interposer forward) für Generics
 
Hallo zusammen,

eine Frage an die Sprachexperten.

Ich habe in einer Unit eine Typdefinition, wie zum Beispiel:

Delphi-Quellcode:
type
    TGenericsKlasse<    TResult> = reference to procedure (       AResult    : TResult );

Jetzt möchte ich diesen Typen in einer anderen Unit nutzen, und erneut definieren um diesen Typen 1:1 weiterzuleiten.
(Mangels einer besseren Bezeichnung nenne ich das Verfahren "interposer forward").
Edit: Wie oben korrigiert, nennt man den Konstrukt besser Type "Alias".


Das sieht normalerweise bei so aus:

Delphi-Quellcode:
type
    TNormaleKlasse = Aus.Einer.Anderen.Unit.TNormaleKlasse; // interposer forward
Das funktionier Alles wunderbar.


Versuche ich das aber mit Generics, schon funktionert das Ganze so einfach nicht mehr:

Delphi-Quellcode:
type
    TGenericsKlasse   = Aus.Einer.Anderen.Unit.TGenericsKlasse;   //interposer forward geht so nicht
    TGenericsKlasse<T> = Aus.Einer.Anderen.Unit.TGenericsKlasse<T>; //Neee, so auch nicht

Gibt es da irgendeinen schönen Trick oder eine andere Konfiguration der Klassen um das
gewünschte Ergebnis doch hinzubekommen ?

haentschman 14. Feb 2020 09:07

AW: Interposer forward für Generics
 
Zitat:

Delphi-Version: 5
...Generics? :gruebel:

Der schöne Günther 14. Feb 2020 09:30

AW: Interposer forward für Generics
 
Was du meinst ist ein "Alias".

Du musst den Typparameter schon immer ausfüllen.

Heißt:

Angenommen du definierst
Delphi-Quellcode:
TStuff<T> = reference to procedure(out Result: T);
Dann existiert TStuff nicht. Es gibt TStuff<Byte>, TStuff<TObject> und was auch immer, aber auch nur das.


Definiert doch den Typen einmal in einer Unit und verwende die dann. Das hinter x verschiedenen Bezeichnungen bekannt zu machen hilft der Übersicht wirklich nicht.

Rollo62 14. Feb 2020 13:00

AW: Interposer forward für Generics
 
Zitat:

Zitat von haentschman (Beitrag 1457464)
Zitat:

Delphi-Version: 5
...Generics? :gruebel:

Jetzt ists richtig, habe die kleine Checkbox übersehen ..

Alias: auch gut.
Mit den offiziellen Bezeichnungen stehe ich manchmal auf Kriegsfuß, für mich sind "Generics" auch noch "Templates" (C++) :stupid:

Das die Anwenung einen <T> Type braucht ist klar,
aber die Definition würde ich gerne weitergeben an eine zentrale Manager-Unit.
Ich versuche meine Projekte möglichst stark zu modularisieren, aber würde dann manchmal gewisse "Standardtypen" der Bequemlichkeit halber weiterreichen.

himitsu 14. Feb 2020 16:28

AW: Interposer forward für Generics
 
Die generische Deklaration ist "noch" kein Typ und du kannst nur für "fertige" Typen einen Alias erstellen.

Hast du eine Ableitung des Generics, dann klappt es, aber ist wohl nicht das hier Gewünschte.

Delphi-Quellcode:
type
  TMyGenericsProc<TResult> = reference to procedure(AResult: TResult);
  TMyGenericsStringProc = TMyGenericsProc<string>;
Delphi-Quellcode:
type
  TMyGenericsStringProc = OtherUnit.TMyGenericsStringProc;

type
  TMyGenericsStringProc = {OtherUnit.}TMyGenericsProc<string>;
Bei Typen mit einer Vererbungshierarchie ginge es aber, allerdings nicht als Alias, sondern nur als neuer generischer Typ (Nachfahre).
Delphi-Quellcode:
type
  TMyGenericsClass<TResult> = class
    X: TResult;
  end;
  TMyGenericsStringClass = TMyGenericsClass<string>;
Delphi-Quellcode:
type
  //TMyGenericsClass<T> = OtherUnit.TMyGenericsClass<T>; // nein
  //TMyGenericsClass<T> = type OtherUnit.TMyGenericsClass<T>; // auch nicht
  TMyGenericsClass<T> = class(OtherUnit.TMyGenericsClass<T>);

type
  TMyGenericsStringClass = {OtherUnit.}TMyGenericsClass<string>;

hoika 14. Feb 2020 16:42

AW: Alias (Interposer forward) für Generics
 
Hallo,
Zitat:

Die generische Deklaration ist "noch" kein Typ und du kannst nur für "fertige" Typen einen Alias erstellen.
Genau.

Und um zu den Templates in C++ (Vorlagen) zu kommen.
Das Wort Vorlagen ist besser gewählt.
Es sind Vorlagen zu Typen, keine Typen selbst.

Rollo62 18. Feb 2020 15:29

AW: Alias (Interposer forward) für Generics
 
Hallo himitsu,

ja dankesehr, das die Generics noch nicht ausdefiniert sind macht Sinn.
Ich hätte ja auch nur gehofft das es einen Trick/Hack oder ähnlich dazu gegeben hätte,
um diese Vorlage weiterzureichen.

Die ausdefinierten Klassen lassen sich natürlich weiterreichen, so mache ich es ja auch.
Delphi-Quellcode:
type
   TMyGenericsStringClass = TMyGenericsClass<string>;

Stevie 19. Feb 2020 09:28

AW: Alias (Interposer forward) für Generics
 
Geht nicht und wird vermutlich auch so bald nicht kommen - siehe https://quality.embarcadero.com/browse/RSP-27505


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