Too*_*the 36 delphi class helper
Delphi(可能还有许多其他语言)都有类助手.这些提供了一种向现有类添加额外方法的方法.没有做一个子类.
那么,班主任的好用途是什么?
gab*_*abr 33
我正在使用它们:
要向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 }
Run Code Online (Sandbox Code Playgroud)简化对记录字段的访问并删除强制转换.
Too*_*the 14
起初,我对课堂助手持怀疑态度.但后来我读了一篇有趣的博客文章,现在我确信它们确实很有用.
例如,如果您想要现有实例类的额外功能,并且由于某种原因您无法更改现有源.您可以创建一个类助手来添加此功能.
例:
type
TStringsHelper = class helper for TStrings
public
function IsEmpty: Boolean;
end;
function TStringsHelper.IsEmpty: Boolean;
begin
Result := Count = 0;
end;
Run Code Online (Sandbox Code Playgroud)
每次,我们现在使用TStrings的(子类)的实例,并且TStringsHelper在范围内.我们可以访问方法IsEmpty.
例:
procedure TForm1.Button1Click(Sender: TObject);
begin
if Memo1.Lines.IsEmpty then
Button1.Caption := 'Empty'
else
Button1.Caption := 'Filled';
end;
Run Code Online (Sandbox Code Playgroud)
笔记:
这听起来非常像C#3(和VB9)中的扩展方法.我见过的最好的用法是对IEnumerable<T>(和IQueryable<T>)的扩展,它允许LINQ对任意序列起作用:
var query = someOriginalSequence.Where(person => person.Age > 18)
.OrderBy(person => person.Name)
.Select(person => person.Job);
Run Code Online (Sandbox Code Playgroud)
(或者其他什么,当然).所有这一切都是可行的,因为扩展方法允许您有效地将对静态方法的调用链接在一起,这些方法采用与返回时相同的类型.