class helper for Txxx
这个一般都知道就是对类的扩展,不说了
record helper for 基本类型或其它记录
这个就有意思了,我们知道 Java中 枚举是一个类,可以使用一些接口,或定义一些方法;而delphi中,枚举就是一个简单的常量集合,不能有方法,那么就无法与Java 保持一致了,给自动生成代码带来了一些困扰,delphi 里的 枚举是无法直接使用 class helper 来扩展的,但是可以使用 record helper 来扩展,从而达到了 与 Java里 一样的效果;举例:
program EnumToStringDemo;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TModelType = (A, B, C);
TModelTypeHelper = record helper for TModelType
public
function ToString: string;
end;
{ TModelTypeHelper }
function TModelTypeHelper.ToString: string;
begin
case Self of
TModelType.A: Result := 'A';
TModelType.B: Result := 'B';
TModelType.C: Result := 'C';
else
Result := 'Unknown';
end;
end;
var
modelType: TModelType;
begin
modelType := TModelType.A;
Writeln(modelType.ToString); // 输出 'A'
modelType := TModelType.B;
Writeln(modelType.ToString); // 输出 'B'
modelType := TModelType.C;
Writeln(modelType.ToString); // 输出 'C'
Readln; // 暂停控制台输出窗口
end.
我们也可以对 delphi 的基本类型进行扩展,比如:
TVariantHelper = record helper for Variant
public
function isBlank: Boolean;
end;
function TVariantHelper.isBlank: Boolean;
begin
if (Self = Null) or (Self = '') or (Trim(Self) = '') then
begin
Exit(True);
end;
Result := False;
end;
由于基本类型 扩展后,没有智能提示,是 IDE的问题,以后可能会解决掉,知道有这么回事就可;
另外留意一点 就是 Self 这个对象 ,就是 扩展方法的当前实例值;
这个 self 很好啊;
2024.9.20 这样 对枚举的扩展有个弊端,就是只能对枚举实例 进行扩展,若要 uiNameToEnum,则不行,只能 self.toUiName; 使用上也不统一,不如我的 TEnumHelper.toUiName / toEnumValue 使用上 来的统一,简单直接;
TModelType = (A, B, C);
TModelTypeHelper = record helper for TModelType
public
function toUiName: string; //普通的方法
class function toEnumVal(uiName: string): TModelType; static; //类方法,枚举实例也可以调用类方法
end;
故而决定放弃 枚举类的 helper,还是继续使用 枚举类的辅助类,这样使用上比较清晰明了;
我测试了下,目前在delphi里 做不到让一个静态类方法只能类调用,不可实例调用,这样是做不到的;故而放弃枚举类 扩展的想法
本文来自博客园,作者:del88,转载请注明原文链接:https://www.cnblogs.com/del88/p/18422660