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 这个对象 ,就是 扩展方法的当前实例值;

image

这个 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;

image

故而决定放弃 枚举类的 helper,还是继续使用 枚举类的辅助类,这样使用上比较清晰明了;
我测试了下,目前在delphi里 做不到让一个静态类方法只能类调用,不可实例调用,这样是做不到的;故而放弃枚举类 扩展的想法

posted on 2024-09-20 15:57  del88  阅读(64)  评论(0编辑  收藏  举报