我创建了这个帮助器,以便为string
类型添加更多功能:
type
AStringHelper = record helper for string
function Invert: string; overload;
function InvertMe: string; overload;
end;
但是当我在代码中使用它时,TStringHelper
中的System.StrUtils
会“退出”,我无法使用它的功能。
它们可以共存吗?
答案 0 :(得分:12)
在代码中的任何一点,最多只能有一个帮助程序处于活动状态。 documentation说明了这一点:
您可以使用单个帮助程序定义和关联多个帮助程序 类型。但是,任何情况下只适用零或一个助手 源代码中的具体位置。帮助器定义在 最近的范围将适用。类或记录助手范围是 以正常的德尔福方式确定(例如,正确 留在单位的使用条款中。)
由于记录助手不支持继承,除了重新实现标准助手的功能之外,没有办法让标准助手和助手的功能同时处于活动状态。
答案 1 :(得分:3)
一个简单的解决方案可能是:
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
方法语法。
答案 2 :(得分:3)
尝试创建自己的类和助手
TMyString = type string;
TMyStringHelper = record helper for TMyString
function Invert: TMyString;
function ToString: string;
end;
使用TMyString而不是String。
使用标准字符串助手将TMyString变量用String()包装或使用ToString方法。
var
S1: TMyString;
S2: String;
begin
S1 := ' 123456 ';
S1.Invert;
S2 := String(S1).Trim;
S2 := S1.ToString.Trim;
end;
答案 3 :(得分:0)
另一种可能性是使用助手提供的“祖先列表”选项
语法:
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