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

时间:2012-11-17 13:37:04

标签: freepascal delphi class-constructors

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

2 个答案:

答案 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;