1

我正在编写一个 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 中的内容完全相同。有没有办法实现它?

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

4

2 回答 2

1

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

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

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

于 2012-11-18T11:07:57.600 回答
0

我通过这个实现了一些关于你的问题:

 class function MyClass.getName:string;
 begin;
  inherited;
  Log_write('~~~~~.getName'+ClassType.ClassName); 
end;
于 2020-02-29T12:07:10.277 回答