Delphi Helper Record Class

4978 ワード

unit Unit1;



{$DEFINE USESGUIDHELP}



interface



implementation



{$IFDEF USESGUIDHELP}

uses System.SysUtils;

{$ENDIF}



procedure test;

var

  a:TGUID;//System 

begin

  {$IFDEF USEGUIDHELP}

  a.NewGuid   // System.SysUtils.TGuidHelper

  a.Create()  // System.SysUtils.TGuidHelper

  {$ENDIF}

end;


end.

 
  PGUID = ^TGUID;

  TGUID = packed record

    D1: LongWord;

    D2: Word;

    D3: Word;

    D4: array[0..7] of Byte;

    class operator Equal(const Left, Right: TGUID): Boolean;

    class operator NotEqual(const Left, Right: TGUID): Boolean;

    class function Empty: TGUID; static;

  end;
type

  TGuidHelper = record helper for TGUID

    class function Create(const B: TBytes): TGUID; overload; static;

    class function Create(const S: string): TGUID; overload; static;

    class function Create(A: Integer; B: SmallInt; C: SmallInt; const D: TBytes): TGUID; overload; static;

    class function Create(A: Integer; B: SmallInt; C: SmallInt; D, E, F, G, H, I, J, K: Byte): TGUID; overload; static;

    class function Create(A: Cardinal; B: Word; C: Word; D, E, F, G, H, I, J, K: Byte): TGUID; overload; static;

    class function NewGuid: TGUID; static;

    function ToByteArray: TBytes;

    function ToString: string;

  end;

 
1、Recordは継承をサポートせず、Helperを使用して間接的に継承を完了した
2、Recordをそれぞれのユニット(ネーミングスペース)に、Helperを選択可能に使用し、元の呼び出しに影響を及ぼさずに拡張コードでHelperを使用する方法、元のRecordやclass定義を変更せずに直接上書きする方法があります.