12.4.5 类型别名助手
正如我们所见,不能为相同类型定义两个助手,更不用说原生数据类型了。那么如何向原生数据类型(例如 Integer)添加额外的直接操作呢?虽然没有明确的解决方案,但有一些可能的解决方法(除了复制内部类助手源代码并添加额外的方法)。 我喜欢的解决方案是定义一个类型别名。类型别名被编译器视为全新的类型,因此它可以有自己的助手而不替换原始类型的助手。现在,鉴于这两种类型是独立的,你仍然不能将两个类助手的方法应用于同一变量,但可以将其中一组进行类型转换。我将用代码来解释这一点。假设你创建了一个类型别名,如下所示:
type
MyInt = type Integer;
现在,你可以为这种类型定义一个助手:
type
TMyIntHelper = record helper for MyInt
function AsString: string;
end;
function TMyIntHelper.AsString: string;
begin
Result := IntToStr(Self);
end;
如果你声明这种新类型的变量,访问该变量将默认允许你调用新类型的助手,但你仍然可以通过转换访问 Integer 类型的助手—这段代码在 TypeAliasHelper
示例中,你可以进一步尝试改写为其他形式:
procedure TForm1.Button1Click(Sender: TObject);
var
MI: MyInt;
begin
MI := 10;
Show(MI.AsString);
// Show(MI.ToString); // 这不起作用
Show(Integer(MI).ToString);
end;