Wie kann ich für beide Seiten abhängige Sätze implizite Konvertierung Operatoren definieren?

StackOverflow https://stackoverflow.com/questions/770809

  •  12-09-2019
  •  | 
  •  

Frage

ich den Bediener verwende für Aufzeichnungen in Delphi Überlastung 2006. (Bitte verwenden Sie diese Frage nicht beantworten, indem sie sagen mir nicht zu.)

Ich habe zwei Satztypen mit dem impliziten Betreiber überlastet. Sie sind beide nur in der Implementierung des Moduls, nicht über die Schnittstelle freigelegt.

Mein Problem ist jetzt, dass sie sich gegenseitig bedingen, ich weiß nicht, wie zu übermitteln die zweite Art an den Compiler zu erklären. Ich weiß, wie dies zu tun, mit Funktionen, Prozeduren und Klassen, aber nicht mit Einträgen.

Hier ist ein vereinfachtes Beispiel von dem, was ich zu tun versuchen:

implementation

type
  TMyRec1 = record
    Field1 : Integer;
    class operator Implicit(a: TMyRec2): TMyRec1;  // <---- Undeclared Identifier here.
  end;

  TMyRec2 = record
    Field2: Integer;
    class operator Implicit(a: TMyRec1): TMyRec2;
  end;

class operator TMyRec1.Implicit(a:TMyRec2): TMyRec1;
begin
  Result.Field1 := a.Field2;
end;

class operator TMyRec2.Implicit(a:TMyRec2): TMyRec2;
begin
  Result.Field2 := a.Field1;
end;
War es hilfreich?

Lösung

Sie können nicht nach vorne Erklärungen für Datensatztypen haben. Definieren Sie beide Implicit Operatoren in der zweiten Art:

type
  TMyRec1 = record
    Field1 : Integer;
  end;

  TMyRec2 = record
    Field2: Integer;
    class operator Implicit(a: TMyRec2): TMyRec1;
    class operator Implicit(a: TMyRec1): TMyRec2;
  end;

Zitiert von Hilfe :

  

Implizite Konvertierungen sollte nur vorgesehen werden, wenn unbedingt notwendig, und Reflexivität vermieden werden sollte. Es ist am besten Typ B wandeln sich zu lassen implizit A Typ und Typ A lassen keine Kenntnis vom Typ B (oder umgekehrt).

Andere Tipps

Sie könnte der Lage sein, diese Helfer mit Datensatz zu tun.

Im Folgenden finden Sie, was ich tat, um vor kurzem um die Unmöglichkeit zu arbeiten, um eine forward record Rekorderklärung mit.

Es verwendet das record helper Konstrukt, das - wie implicit type casts -. Nachteil zu haben
Das wichtigste ist, dass nur der nächste record helper für einen bestimmten Typ record gelten.

type
  TIpv4Address = record
  strict private
    FAddress: TIpv4Quad;
    FMask: TIpv4Quad;
  private
    class function CreateInternal(const IP_ADDR_STRING: _IP_ADDR_STRING): TIpv4Address; static;
  public
    class function Create(const IP_ADDR_STRING: _IP_ADDR_STRING): TIpv4Address; static;
    class function Count(const IP_ADDR_STRING: _IP_ADDR_STRING): Integer; static;
    property Address: TIpv4Quad read FAddress;
    property Mask: TIpv4Quad read FMask;
  end;

  TIpv4AddressList = array of TIpv4Address;

  TIpv4AddressHelper = record helper for TIpv4Address
    class function CreateList(const IP_ADDR_STRING: _IP_ADDR_STRING): TIpv4AddressList; static;
  end;

Sie verwenden es wie folgt aus:

function TAdapterInfo.GetIpAddressList: TIpv4AddressList;
begin
  Result := TIpv4Address.CreateList(AdapterInfos.IP_ADAPTER_INFO[Index].IpAddressList);
end;

- jeroen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top