XE3中Helper的增强.

XE3之前就有想法如果能给String甚至任意类型增加Helper函数有多方便.

每个版本Delphi刚出来我都会试一下Helper能否给简单类型”打补丁”.

自从上次发现XE3有String Helper以后试了一下,现在XE3基本上可以给大多数类型打补丁了,除了Interface类型以外.


type
THInteger = record helper for Integer
function ToStr():String;
end;

THDateTime = record Helper for TDateTime
function GetDate():TDate;
end;

TRects = array of TRect;

THArray = record Helper for TRects
function getlen():Integer;
end;

//THIntf = record Helper for interface //不行
//THIntf = record Helper for IUnknown? //不行
//THIntf = interface Helper for IUnknown? //不行
{ THI }

function THInteger.ToStr: String;
begin
Result := IntToStr(Self);
end;

{ THIntf }


{ THDateTime }

function THDateTime.GetDate: TDate;
begin
Result := Trunc(Self);
end;

{ THArray }

function THArray.getlen: Integer;
begin
Result := Length(Self);
end;

用起来嘛就是这个样子的.

 


var
i : Integer;
begin
i := 10;
Caption := i.ToStr() + Integer(100).ToStr();
end;

很奇怪,也很爽吧.

 

Helper的方便性不用说了,而且编译后Helper本身又是不存在的.仅仅是方法的代码存在而已.实例变成方法的第一个参数.

这和单独写一个方法所占用的空间是相通的,但是却方便了许多.

必须引用Helper所在的单元Helper才能生效,这是个特性还是个遗憾呢?

另外如果有多个Helper的话只有最后一个Helper才会生效.前面的Helper会被丢弃.而不是追加更多的方法.

THInteger1= record helper for Integer
function ToStr1():String;
end;

THInteger2 = record helper for Integer
function ToStr2():String;
end;

如果这样的话Integer类型就只能调用到ToStr2,而调用不到ToStr1了.也就是? THInteger1无效了.这个是好还是坏呢?

另外record中不能重载操作符.例如record helper for Integer中class Operator add(A,B:Integer):Integer;? static;这样的方法就编译不过.想想也是,要是把整数的加法也重载了让号称最严谨的Pascal语言情何以堪呢.

此条目发表在Delphi, 未分类分类目录。将固定链接加入收藏夹。

XE3中Helper的增强.》有4条回应

  1. yryz说:

    多个Helper的话,是可以的:),
    THInteger2 = record helper(THInteger1) for Integer
    end;

  2. 匿名说:

    真棒!这样写代码简洁不少

  3. 匿名说:

    能扩展方法指针吗.

评论已关闭。