我正在编写一个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;