当 class 助手在范围内时如何调用原始 class 的代码?
How to call the original class's code when a class helper is in scope?
我正在对改进版的快速排序进行一些单元测试。
(希望)更快的版本是使用以下方法实现的:
TArrayHelper = class helper for System.Generics.Collections.TArray
....
class procedure Sort<T>(var Values: array of T); overload; static;
class procedure Sort<T>(var Values: array of T; Comparer: IComparer<T>); overload; static;
....
我知道现在我可以将 Sort
重命名为 SortNew
以进行测试,但在某些时候我必须将方法名称固定为 sort
。
如果范围内有 class 助手,我该如何调用原始方法?
有没有办法使用 rtti 或其他迂回方法?
我认为使用纯 Pascal 代码实现此目的的唯一方法是从您的 class 助手未激活的范围调用 Sort
。关键是,如果您的 class 助手处于活动状态,则 Sort
指的是助手中的方法。
比如像这样:
unit ScopeBuster;
interface;
uses
System.Generics.Collections;
type
TArrayScopeBuster = class
class procedure Sort<T>(...); overload; inline; static;
end;
implementation
class procedure TArrayScopeBuster.Sort<T>(...);
begin
TArray.Sort(...);
end;
end.
我正在对改进版的快速排序进行一些单元测试。
(希望)更快的版本是使用以下方法实现的:
TArrayHelper = class helper for System.Generics.Collections.TArray
....
class procedure Sort<T>(var Values: array of T); overload; static;
class procedure Sort<T>(var Values: array of T; Comparer: IComparer<T>); overload; static;
....
我知道现在我可以将 Sort
重命名为 SortNew
以进行测试,但在某些时候我必须将方法名称固定为 sort
。
如果范围内有 class 助手,我该如何调用原始方法?
有没有办法使用 rtti 或其他迂回方法?
我认为使用纯 Pascal 代码实现此目的的唯一方法是从您的 class 助手未激活的范围调用 Sort
。关键是,如果您的 class 助手处于活动状态,则 Sort
指的是助手中的方法。
比如像这样:
unit ScopeBuster;
interface;
uses
System.Generics.Collections;
type
TArrayScopeBuster = class
class procedure Sort<T>(...); overload; inline; static;
end;
implementation
class procedure TArrayScopeBuster.Sort<T>(...);
begin
TArray.Sort(...);
end;
end.