是否可以为字符串类型使用两个记录助手?

时间:2013-07-27 15:56:26

标签: delphi class-helpers

我创建了这个帮助器,以便为string类型添加更多功能:

type
  AStringHelper = record helper for string
    function Invert: string; overload;
    function InvertMe: string; overload;
  end;

但是当我在代码中使用它时,TStringHelper中的System.StrUtils会“退出”,我无法使用它的功能。

它们可以共存吗?

4 个答案:

答案 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