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

问题描述 投票:1回答:2

我正在编写一个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作为编译器

freepascal delphi class-constructors
2个回答
1
投票

我看不出有什么方法可以达到您的预期。即使TUsers具有自己的类构造函数,也无法使用,因为FTableName在TghModel和所有子类之间共享。为了解决这个问题,我看到了两个解决方案:使用类似

的方法动态创建表名。
class function TghModel.TableName : string;
  begin
    Result := ClassName;
    Delete(Result,1,1);
  end; 

或者,如果它对速度至关重要,那么也许可以使用基于仿制药的解决方案?


0
投票

我通过以下方式对您的问题有所了解:

 class function MyClass.getName:string;
 begin;
  inherited;
  Log_write('~~~~~.getName'+ClassType.ClassName); 
end;
© www.soinside.com 2019 - 2024. All rights reserved.