Wie kann ich für beide Seiten abhängige Sätze implizite Konvertierung Operatoren definieren?
-
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;
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