12.4.4 原生类型的记录助手
记录助手概念的进一步扩展是能够向本地(或编译器支持的原生)数据类型添加方法。虽然使用相同的“记录助手”语法,但不是应用于记录而是普通数据类型。
注意:记录助手当前可以用于增强和添加操作到原生数据类型,但这在将来可能会改变。今天的运行时库定义了一些数据类型助手在将来可能会消失,保留了使用这些助手的代码的编写方式… 但破坏了定义它们的代码的兼容性。因此,即使这个功能确实非常好用和方便,你也不应该过度使用。
原生数据类型助手在实践中是如何使用的呢?让我们考虑以下对 Integer 类型的助手的定义:
type
TIntHelper = record helper for Integer
function AsString: string;
end;
现在,给定一个整数变量 N,你可以写:
N.AsString;
如何定义伪方法,它又如何引用变量的值呢?通过扩展 Self 标识符的含义,以引用应用于该函数的值:
function TIntHelper.AsString: string;
begin
Result := IntToStr(Self);
end;
请注意,你也可以将方法应用于常量,例如:
Caption := 400000.AsString;
但是,对于一个较小的值,你不能做同样操作,因为编译器将常量解释为最小可能的类型。所以如果你想获取值为 4 的字符串值,与字节匹配,你必须使用第二种形式:
Caption := 4.AsString; // 错误!
Caption := Integer(4).AsString; // 正确
或者你可以通过定义一个不同的助手来使第一种语句编译:
type
TByteHelper = record helper for Byte...
正如我们在第二章中已经看到的,对于 Integer
和 Byte
之类的类型,你实际上不需要编写上述代码,因为运行时库为大多数核心数据类型定义了一个相当全面的类助手,在 System.SysUtils
单元中定义的以下内容:
TGUIDHelper = record helper for TGUID
TStringHelper = record helper for string
TSingleHelper = record helper for Single
TDoubleHelper = record helper for Double
TExtendedHelper = record helper for Extended
TByteHelper = record helper for Byte
TShortIntHelper = record helper for ShortInt
TWordHelper = record helper for Word
TSmallIntHelper = record helper for SmallInt
TCardinalHelper = record helper for Cardinal
TIntegerHelper = record helper for Integer
TUInt64Helper = record helper for UInt64
TInt64Helper = record helper for Int64
TNativeUIntHelper = record helper for NativeUInt
TNativeIntHelper = record helper for NativeInt
TBooleanHelper = record helper for Boolean
TByteBoolHelper = record helper for ByteBool
TWordBoolHelper = record helper for WordBool
TWordBoolHelper = record helper for WordBool
TLongBoolHelper = record helper for LongBool
TCurrencyHelper = record helper for Currency // 在 Delphi 11 中添加
还有一些当前在其他单元中定义的原生数据类型助手,例如:
delphiCopy code// System.Character:
TCharHelper = record helper for Char
// System.Classes:
TUInt32Helper = record helper for UInt32
// System.DateUtils
TDateTimeHelper = record helper for TDateTime // 在 Delphi 11 中添加
鉴于我在书的前半部分的许多示例中已经涵盖了这些助手的使用,这里无需重复它们。本节补充的是如何定义原生数据类型助手的描述。