我在Delphi 2006中使用运算符重载记录。(请不要告诉我不要回答这个问题。)
我有两种记录类型,隐含运算符已重载。它们都只是在模块的实现中,而不是通过接口公开。
我的问题是,既然它们是相互依赖的,我不知道如何将第二种类型转发给编译器。我知道如何使用函数,过程和类来完成此操作,但不知道如何使用记录。
以下是我尝试做的简化示例:
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;
答案 0 :(得分:13)
您不能拥有记录类型的前向声明。在第二种类型中定义两个Implicit
运算符:
type
TMyRec1 = record
Field1 : Integer;
end;
TMyRec2 = record
Field2: Integer;
class operator Implicit(a: TMyRec2): TMyRec1;
class operator Implicit(a: TMyRec1): TMyRec2;
end;
引自the help:
只有在绝对必要的情况下才应提供隐式转换,并应避免反身性。最好让类型B隐式地将自身转换为类型A,并且让类型A不知道类型B(反之亦然)。
答案 1 :(得分:3)
你可能能够通过记录助手来完成此任务。
以下是我最近为处理forward record
记录声明无法解决的问题。
它使用record helper
构造,与implicit type casts
一样 - 也有缺点
最重要的一点是,只适用于特定record helper
类型的最近record
。
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;
你这样使用它:
function TAdapterInfo.GetIpAddressList: TIpv4AddressList;
begin
Result := TIpv4Address.CreateList(AdapterInfos.IP_ADAPTER_INFO[Index].IpAddressList);
end;
- 的Jeroen