我创建了这个助手,以便为该string
类型添加更多功能:
type
AStringHelper = record helper for string
function Invert: string; overload;
function InvertMe: string; overload;
end;
但是当我在我的代码中使用它时,输入TStringHelper
“System.StrUtils
退出”并且我不能使用它的功能。
两者有可能共存吗?
我创建了这个助手,以便为该string
类型添加更多功能:
type
AStringHelper = record helper for string
function Invert: string; overload;
function InvertMe: string; overload;
end;
但是当我在我的代码中使用它时,输入TStringHelper
“System.StrUtils
退出”并且我不能使用它的功能。
两者有可能共存吗?
最多一个助手可以在你的代码中的任何一点激活。文档是这样说的:
您可以定义多个助手并将其与单个类型相关联。但是,只有零个或一个助手适用于源代码中的任何特定位置。在最近的范围内定义的助手将适用。类或记录助手范围以正常的 Delphi 方式确定(例如,在单元的 uses 子句中从右到左)。
由于记录助手不支持继承,因此除了重新实现标准助手的功能外,无法同时激活标准助手和助手的功能。
尝试创建自己的类和助手
TMyString = type string;
TMyStringHelper = record helper for TMyString
function Invert: TMyString;
function ToString: string;
end;
使用 TMyString 而不是 String。
要使用标准的 String 助手,用 String() 包装 TMyString 变量或使用 ToString 方法。
var
S1: TMyString;
S2: String;
begin
S1 := ' 123456 ';
S1.Invert;
S2 := String(S1).Trim;
S2 := S1.ToString.Trim;
end;
一个简单的解决方案可能是:
type
TStr = record
private
FStr:string;
public
function Invert: string; overload;
function InvertMe: string; overload;
end;
通过使用类型转换,您可以访问TStr
普通string
变量上的函数:
var
s1,s2:string;
begin
s1:='123456';
s2:=TStr(s1).invert;
end;
但是当然,那么我们可以问:为什么不写一个普通的函数呢?:-)
无论如何,我喜欢这个class
//方法语法比传统的函数/过程更好object
。record
另一种可能性是使用助手提供的“祖先列表”选项
语法:
type
identifierName = class|record helper [(ancestor list)] for TypeIdentifierName
memberList
end;
并像这样使用:
Unit1:
THelperBase = Class helper for TMyClass
Public
Function SayHello;
end;
Unit2:
Uses Unit1;
THelperChild = Class helper (THelperBase) for TMyClass
Public
Function SayGoodBye;
end;
最后,在您的代码中:
Uses Unit2;
Var MyClass: TMyclass;
MyClass:= TMyclass.Create;
MyClass.SayHello; //valid
MyClass.SayGoodBye; //valid