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 は TghModel ではなく TUsers に初期化されますが、これは誤りです。ユーザーが TghModel を継承するクラスごとにクラス コンストラクターを作成することは避けたいと思います。特に、コンテンツは TghModel.Create とまったく同じになるためです。それを実装する方法はありますか?

PS: コンパイラとして Free Pascal を使用しています

4

2 に答える 2

1

あなたが意図したようにこれを達成する方法はありません。TUsers が独自のクラス コンストラクターを取得したとしても、FTableName は TghModel とすべての子クラスの間で共有されるため、機能しません。これを解決するには、次の 2 つの解決策があります。テーブル名をオンザフライで作成します。

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

または、速度が重要な場合は、ジェネリックベースのソリューションが可能でしょうか?

于 2012-11-18T11:07:57.600 に答える