delphi - conversiones - ¿Cómo puedo definir operadores de conversión implícitos para registros mutuamente dependientes?
configurar conversiones adwords (2)
Es posible que puedas hacer esto con los ayudantes de registro.
A continuación se muestra lo que recientemente hice para evitar la imposibilidad de tener una declaración de registro de forward record
.
Utiliza el constructo de record helper
, que, al igual implicit type casts
, también tiene inconvenientes.
El más importante es que solo se aplicará el record helper
más cercano para un tipo de record
particular.
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;
Lo usas así:
function TAdapterInfo.GetIpAddressList: TIpv4AddressList;
begin
Result := TIpv4Address.CreateList(AdapterInfos.IP_ADAPTER_INFO[Index].IpAddressList);
end;
--jeroen
Estoy utilizando la sobrecarga del operador para los registros en Delphi 2006. (No responda esta pregunta diciéndome que no lo haga).
Tengo dos tipos de registro con el operador implícito sobrecargado. Ambos están solo en la implementación del módulo, no expuestos a través de la interfaz.
Mi problema es que, ahora que dependen mutuamente, no sé cómo reenviar declarar el segundo tipo al compilador. Sé cómo hacer esto con funciones, procedimientos y clases, pero no con registros.
Aquí hay un ejemplo simplificado de lo que estoy tratando de hacer:
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;
No puede tener declaraciones forward para los tipos de registro. Define ambos operadores Implicit
en el segundo tipo:
type
TMyRec1 = record
Field1 : Integer;
end;
TMyRec2 = record
Field2: Integer;
class operator Implicit(a: TMyRec2): TMyRec1;
class operator Implicit(a: TMyRec1): TMyRec2;
end;
Citando de la ayuda :
Las conversiones implícitas se deben proporcionar solo donde sea absolutamente necesario, y se debe evitar la reflexividad. Lo mejor es dejar que el tipo B se convierta implícitamente en el tipo A, y que el tipo A no tenga conocimiento del tipo B (o viceversa).