文章出處 : http://blog.leoshiang.com/?p=74
如果我想新增一個功能可以將 GUID 從串流中讀取,照以前的作法我會這樣設計:
使用方式如下:
這樣的作法,是另外定義一個 procedure 來處理。如果使用 Record Helper 的話可以更簡化:
新建一個類別 TUUID,用 record helper for TGUID 將它與 TGUID 的結合。使用方式如下:
有沒有發現差異在哪?使用 Record Helper 之後,新定義的 FromBytes Method 與原本的 TGUID 結合在一起,也就是說我們不修改原本的程式碼便能為原本的 TGUID 增加新的功能。
註 : Delphi XE3 開始支持......
Class and Record Helpers 是 Delphi 新增的語言特性,它是一種型別與其他類別(Class)或記錄(Record)結合,讓原來的類別可以使用新增的方法(Method)。聽起來有點難懂,我們用一個比較實際的例子來解釋。
Delphi 有一個內建的 Record 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;
如果我想新增一個功能可以將 GUID 從串流中讀取,照以前的作法我會這樣設計:
procedeure GUIDFromBytes( const Data: TBytes; const Index: Integer; var GUID: TGUID);
begin
Move(Bytes[Index], GUID, SizeOf(GUID));
end;
使用方式如下:
var
GUID: TGUID;
Data: TBytes;
begin
GUIDFromBytes(Data, 0, GUID);
end;
這樣的作法,是另外定義一個 procedure 來處理。如果使用 Record Helper 的話可以更簡化:
type
TUUID = record helper for TGUID
procedure FromBytes(Bytes: TBytes; I: Integer);
end;
?
implementation
?
procedure TUUID.FromBytes(Bytes: TBytes; I: Integer);
begin
Move(Bytes[Index], GUID, SizeOf(GUID));
end;
新建一個類別 TUUID,用 record helper for TGUID 將它與 TGUID 的結合。使用方式如下:
var
GUID: TGUID;
Data: TBytes;
begin
GUID.FromBytes(Data, 0);
end;
有沒有發現差異在哪?使用 Record Helper 之後,新定義的 FromBytes Method 與原本的 TGUID 結合在一起,也就是說我們不修改原本的程式碼便能為原本的 TGUID 增加新的功能。