我正在编写一个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将被初始化为TUsers而不是TghModel,这是错误的。我想避免用户为从TghModel继承的每个类创建类构造函数,尤其是因为内容将与TghModel.Create中的内容完全相同。有什么办法可以实现吗?
P.S .:我使用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;