我正在编写一个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作为我的编译器
答案 0 :(得分:1)
我认为无法按照您的意图实现这一目标。即使TUsers有自己的类构造函数,它也行不通,因为在TghModel和所有子类之间共享FTableName。为了解决这个问题,我看到了两个解决方案:使用类似
的方式动态创建表名class function TghModel.TableName : string;
begin
Result := ClassName;
Delete(Result,1,1);
end;
或者如果它对速度至关重要,那么基于泛型的解决方案可能是可能的吗?
答案 1 :(得分:0)
我通过以下方式对您的问题有所了解:
class function MyClass.getName:string;
begin;
inherited;
Log_write('~~~~~.getName'+ClassType.ClassName);
end;