如何使类构造函数体调用后代的重写方法/属性?



我正在编写一个ORM框架,但陷入了从类名自动确定表名的方式。在 ORM 工作的基本对象中,我有:

TghModel = class
...
  class var FTableName: String;
  class constructor Create;
...

其实现为:

class constructor TghModel.Create;
begin
  FTableName := ClassName;
  Delete(FTableName,1,1); // Delete 'T'
end;

我的假设是 ClassName 方法将返回真实的类名。 例如,如果我有:

TUsers = class(TghModel)

那么FTableName将被初始化为TUser而不是TghModel,这是错误的。我想避免用户为继承自 TghModel 的每个类制作类构造函数,特别是因为内容与 TghModel.Create 中的内容完全相同。有什么办法实现它吗?

PS:我正在使用Free Pascal作为我的编译器

我认为没有办法按照您的意图实现这一目标。即使 TUsers 有自己的类构造函数,它也不会起作用,因为 FTableName 在 TghModel 和所有子类之间共享。为了解决这个问题,我看到了两种解决方案:使用类似的东西动态创建表名

class function TghModel.TableName : string;
  begin
    Result := ClassName;
    Delete(Result,1,1);
  end; 

或者,如果它对速度至关重要,也许基于泛型的解决方案可能是可能的?

我通过这个获得了关于你的问题:

 class function MyClass.getName:string;
 begin;
  inherited;
  Log_write('~~~~~.getName'+ClassType.ClassName); 
end;

最新更新