Delphi(可能还有许多其他语言)都有类助手.这些提供了一种向现有类添加额外方法的方法.没有做一个子类.
那么,班主任的好用途是什么?
我正在使用它们:
要插入普查员进入一个没有实现他们VCL类.
为了增强 VCL类.
要向TStrings类添加方法,以便在派生列表和TStringList中使用相同的方法.
TGpStringListHelper = class helper for TStringList public function Last: string; function Contains(const s: string): boolean; function FetchObject(const s: string): TObject; procedure Sort; procedure Remove(const s: string); end; { TGpStringListHelper }
简化对记录字段的访问并删除强制转换.
起初,我对课堂助手持怀疑态度.但后来我读了一篇有趣的博客文章,现在我确信它们确实很有用.
例如,如果您想要现有实例类的额外功能,并且由于某种原因您无法更改现有源.您可以创建一个类助手来添加此功能.
例:
type TStringsHelper = class helper for TStrings public function IsEmpty: Boolean; end; function TStringsHelper.IsEmpty: Boolean; begin Result := Count = 0; end;
每次,我们现在使用TStrings的(子类)的实例,并且TStringsHelper在范围内.我们可以访问方法IsEmpty.
例:
procedure TForm1.Button1Click(Sender: TObject); begin if Memo1.Lines.IsEmpty then Button1.Caption := 'Empty' else Button1.Caption := 'Filled'; end;
笔记:
类助手可以存储在一个单独的单元中,因此您可以添加自己的漂亮的类助手.请务必为这些单位提供一个易于记忆的名称,例如ClassesHelpers,用于Classes单元的帮助程序.
还有记录助手.
如果范围内有多个类助手,可能会遇到一些问题,只能使用一个助手.
这听起来非常像C#3(和VB9)中的扩展方法.我见过的最好的用法是对IEnumerable
(和IQueryable
)的扩展,它允许LINQ对任意序列起作用:
var query = someOriginalSequence.Where(person => person.Age > 18) .OrderBy(person => person.Name) .Select(person => person.Job);
(或者其他什么,当然).所有这一切都是可行的,因为扩展方法允许您有效地将对静态方法的调用链接在一起,这些方法采用与返回时相同的类型.