代码之家  ›  专栏  ›  技术社区  ›  Richard A

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

  •  13
  • Richard A  · 技术社区  · 17 年前

    我在Delphi2006中使用操作符重载记录。(请不要告诉我不要回答这个问题。)

    我有两种类型的唱片 含蓄的 运算符过载。它们都只是在模块的实现中,没有通过接口公开。

    我的问题是,既然它们相互依赖,我不知道如何将第二种类型的声明转发给编译器。我知道如何使用函数、过程和类来实现这一点,但不知道如何使用记录。

    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 回复  |  直到 12 年前
        1
  •  14
  •   Rob Kennedy    17 年前

    不能对记录类型进行转发声明。定义两者 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(反之亦然)。

        2
  •  3
  •   Jeroen Wiert Pluimers    15 年前

    可以 可以使用记录助手来完成此操作。

    下面是我最近所做的工作,以解决不可能有一个 forward record 记录声明。

    它使用 record helper 构造,哪一类 implicit type casts -也有缺点。
    最重要的是,只有最近的 记录助手 为了某一特定的目的 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;
    

    --杰罗恩

    推荐文章