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语言情何以堪呢.
多个Helper的话,是可以的:),
THInteger2 = record helper(THInteger1) for Integer
end;
你试下,我的结论是class Helper才可以继承,record Helper是不能继承的
真棒!这样写代码简洁不少
能扩展方法指针吗.