使用两个记录辅助器来处理字符串类型是否可行?

11

我创建了这个帮助程序来为 string 类型添加一些更多的函数:

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

但是当我在我的代码中使用它时,System.StrUtils 中的 TStringHelper "离开了",因此我无法使用它的函数。

它们是否可能同时存在?


1
就我所知,Reverse 是一个更常用的名称来描述您的函数所做的事情。 - David Heffernan
我以前也用过 Reverse... - NaN
4个回答

13

在您的代码中任何一点最多只能有一个帮助器处于活动状态。 文档 上说:

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

由于记录帮助器不支持继承,除了重新实现标准帮助器的功能之外,没有办法同时激活标准帮助器和您的帮助器的功能。


事实上,重新实现将是最简单的方法,只需使用TStringHelper函数来实现重新实现,即使用聚合而不是继承。 - Rudy Velthuis
@RudyVelthuis:重新实现是什么意思?你能举个例子吗? - Chau Chee Yang
只需编写一个新的字符串助手并使用现有的字符串助手来实现它。问题在于助手不能拥有自己的实例变量。 - Rudy Velthuis
1
五年过去了,现在仍然不可能拥有自定义的 StringHelper 函数,并且还要保留现有的函数(而无需复制/修改原始单元或像其他答案中所提供的奇怪解决方法)?这真是让人沮丧。不知道 Embarcadero 为什么仍不允许记录辅助继承? - CodeX

7
尝试创建自己的类和帮助程序。
TMyString = type string;
TMyStringHelper = record helper for TMyString 
  function Invert: TMyString; 
  function ToString: string;
end;

使用 TMyString 替代 String。

要使用标准的 String helpers,请使用 String() 包装 TMyString 变量或使用 ToString 方法。

var
  S1: TMyString;
  S2: String;
begin
  S1 := ' 123456 ';
  S1.Invert;
  S2 := String(S1).Trim;
  S2 := S1.ToString.Trim;
end;

我实际尝试了这个方法,它完美地运行了。你唯一需要做的事情就是在使用TMyString记录助手之前将一个字符串放入你的TMyString值中。 - Stefaan

4
另一种可能性是使用助手提供的“祖先列表”选项。
语法:
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

2
祖先列表是可选的。它只能为类助手指定。所以这似乎是类助手的解决方案,但不适用于记录助手 :-( - dominikkv

3
一个简单的解决方案可以是:
type
  TStr = record
  private
    FStr:string;
  public
    function Invert: string; overload;
    function InvertMe: string; overload;
  end;

通过使用类型转换,您可以在普通的字符串变量上访问TStr上的函数:
var
  s1,s2:string;
begin
  s1:='123456';
  s2:=TStr(s1).invert;
end;

当然,我们可以问:为什么不只是编写一个普通函数呢?:-)

无论如何,我更喜欢这种类/对象/记录方法语法,而不是传统的函数/过程。


因为这些家伙认为对象方法的方式更好,我们不应将它们与直接函数调用混合使用。 :-/ - NaN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接