11

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

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

但是当我在我的代码中使用它时,输入TStringHelperSystem.StrUtils退出”并且我不能使用它的功能。

两者有可能共存吗?

4

4 回答 4

12

最多一个助手可以在你的代码中的任何一点激活。文档是这样说的:

您可以定义多个助手并将其与单个类型相关联。但是,只有零个或一个助手适用于源代码中的任何特定位置。在最近的范围内定义的助手将适用。类或记录助手范围以正常的 Delphi 方式确定(例如,在单元的 uses 子句中从右到左)。

由于记录助手不支持继承,因此除了重新实现标准助手的功能外,无法同时激活标准助手和助手的功能。

于 2013-07-27T16:29:41.770 回答
5

尝试创建自己的类和助手

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;
于 2016-07-19T09:33:04.057 回答
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//方法语法比传统的函数/过程更好objectrecord

于 2015-12-15T13:18:56.000 回答
3

另一种可能性是使用助手提供的“祖先列表”选项

语法:

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
于 2019-02-13T15:02:17.970 回答