Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Record Helper für generische Records (Spring) (https://www.delphipraxis.net/182424-record-helper-fuer-generische-records-spring.html)

Nersgatt 23. Okt 2014 09:46

Delphi-Version: 5

Record Helper für generische Records (Spring)
 
Moin,

ich setze das Spring-Framework ein, insbesondere daraus die Nullable-Typen.
Nun wollte ich für diese Typen Record Helper basteln. Das compiliert auch korrekt. Jedoch wird bei der Codeausführung ein falscher Recordhelper verwendet (die Ausführung springt in den falschen Helper).

Codebeispiel:
Delphi-Quellcode:
uses
  [...] Spring, System.JSON;

type
  TNullableStringHelper = record helper for TNullableString
  public
    function getJSONValue : TJSONValue;
  end;

  TNullableBooleanHelper = record helper for TNullableBoolean
  public
    function getJSONValue : TJSONValue;
  end;
Implementiert:
Delphi-Quellcode:
{ TNullableStringHelper }

function TNullableStringHelper.getJSONValue: TJSONValue;
begin
  if self.HasValue then
    result := TJSONString.Create(self.GetValueOrDefault)
  else
    result := TJSONNull.Create;
end;

{ TNullableBooleanHelper }

function TNullableBooleanHelper.getJSONValue: TJSONValue;
begin
  if self.HasValue then
    if self.GetValueOrDefault then
      result := TJSONTrue.Create
    else
      result := TJSONFalse.Create
  else
    result := TJSONNull.Create;
end;
Wenn ich dies nun teste:
Delphi-Quellcode:
procedure TForm10.FormCreate(Sender: TObject);
var
  str : TNullableString;
  jv : TJSONValue;
begin

  str := 'Test';
  jv := str.getJSONValue;

  self.Caption := jv.ToJSON;

end;
stelle ich fest, dass immer in den Helper TNullableBooleanHelper gesprungen wird, statt in den TNullableStringHelper, wie ich es erwarten würde.
Ich kann mir das Verhalten so gar nicht erklären. In der Caption des Formulars steht nach Ausführung "True" und nicht "Test" wie ich es erwarten würde. Es ist also nicht nur ein Problem des Debuggers, sondern wird tatsächlich so ausführt.

Für die, die das Spring-Framework nicht kennen, die Nullable-Typen sehen so aus:
Es gibt den Record Nullable:
Delphi-Quellcode:
Nullable<T> = record
[...]
Darauf bauen die anderen Typen auf:
Delphi-Quellcode:
TNullableString = Nullable<string>;
TNullableBoolean = Nullable<Boolean>;
Kann mir jemand helfen?

Danke!
Jens

Uwe Raabe 23. Okt 2014 09:53

AW: Record Helper für generische Records (Spring)
 
Ich kann es gerade nicht ausprobieren, aber versuch mal folgende Definitionen vor deine Helper zu setzen

Delphi-Quellcode:
TNullableString = type Spring.TNullableString;
TNullableBoolean = type Spring.TNullableBoolean;

Nersgatt 23. Okt 2014 09:58

AW: Record Helper für generische Records (Spring)
 
Das lässt sich leider nicht kompilieren:
Delphi-Quellcode:
[dcc32 Fehler] Unit10.pas(10): E2574 Instantiierter Typ kann nicht für TYPE-Typdeklaration verwendet werden

Der schöne Günther 23. Okt 2014 10:10

AW: Record Helper für generische Records (Spring)
 
Das macht ja auch keinen Sinn, denn
Delphi-Quellcode:
TNullableString
ist sein eigener Typ (warum eigentlich?) und nicht aus Spring.

Interessant ist auch, dass schon die IDE selbst mit STRG+Klick auf
Delphi-Quellcode:
ToJSON()
in den letzten Helper springt!

Ob das mit der Operator-Überladung für
Delphi-Quellcode:
Implicit
bei
Delphi-Quellcode:
Nullable<>
zu tun hat?

Uwe Raabe 23. Okt 2014 10:14

AW: Record Helper für generische Records (Spring)
 
Zitat:

Zitat von Nersgatt (Beitrag 1277109)
Das lässt sich leider nicht kompilieren:
Delphi-Quellcode:
[dcc32 Fehler] Unit10.pas(10): E2574 Instantiierter Typ kann nicht für TYPE-Typdeklaration verwendet werden

Recht haste!

Dann sehe ich im Moment keine Möglichkeit da raus zu kommen. Da Records nicht abgeleitet werden können und Helper auf generische Typen sich nicht nach Typen unterscheiden lassen, sieht das schlecht aus für deinen Ansatz.

Nersgatt 23. Okt 2014 10:30

AW: Record Helper für generische Records (Spring)
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1277112)
Dann sehe ich im Moment keine Möglichkeit da raus zu kommen. Da Records nicht abgeleitet werden können und Helper auf generische Typen sich nicht nach Typen unterscheiden lassen, sieht das schlecht aus für deinen Ansatz.

Ich hatte auch versucht, direkt einen Helper für Nullable<T> zu schreiben. Aber da hab ich so gar keinen Ansatz gefunden.
Delphi-Quellcode:
NullableHelper = record helper for Nullable<T>
wird mit
Zitat:

[dcc32 Fehler] Unit10.pas(10): E2003 Undeklarierter Bezeichner: 'T'
quittiert.


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