如何为相互依赖的记录定义隐式转换运算符?

时间:2009-04-21 02:15:11

标签: delphi delphi-2006

我在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;

2 个答案:

答案 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