0

私は基本的にこのオブジェクト構造を持っています:

TJSONStructure = class(TObject);

TReqBase = class(TJSONStructure)
private
   token: Int64;
public
   procedure FillWithTemplateData; virtual;
end;

TReqLogin = class(TReqBase)
private
   username,
   password: String;
   module  : Integer;
public
   procedure FillWithTemplateData; override;
end;

procedure TReqBase.FillWithTemplateData;
begin
   token := ...;
end;

procedure TReqLogin.FillWithTemplateData;
begin
   inherited;
   username := ...;
   password := ...;
   module   := ...;
end;

type
   TWebAct = (ttlogin,
              ttsignin);

TReqClass = class of TReqBase;

const
   cWebActStructures: Array[TWebAct] of
   record
      RequestClass : TReqClass;
   end
   = (
      { ttlogin  } (RequestClass: TReqLogin;),
      { ttsignin } (RequestClass: TReqSignIn;)     // Not in definitions above
     ); 

今私がやります:

var
   lWebAct       : TWebAct;
   lRequestClass : TReqClass;
begin
   for lWebAct := Low(TWebAct) to High(TWebAct) do
   begin
      lRequestClass := cWebActStructures[lWebAct].RequestClass;

そして電話したい

lRequestClass.FillWithTemplateData;

TReqLogin.FillWithTemplateDatalWebAct =ttloginなどのときに実行するため
ですが、コンパイルされません:E2706 This form of method call only allowed for class methods.

理由 (コンパイラ メッセージのテキスト) は理解していますが、コード内の TReqLogin、TReqSignIn タイプのリストを処理する必要なく (再び) lWebAct=ttlogin などのときに TReqLogin.FillWithTemplateData が実行されるようにするにはどうすればよいでしょうか?

4

2 に答える 2

2

lRequestClassクラスリファレンスです。メソッドを呼び出すことはできますclassが、インスタンス メソッドを呼び出すことはできません。インスタンスFillWithTemplateDataメソッドです。

インスタンス メソッドを呼び出すには、インスタンスが必要です。したがって、インスタンス化します。

var 
  req: TReqBase; 
....
req := lRequestClass.Create; 
try
  req.FillWithTemplateData;
  ...
finally
  req.Free;
end;

コンストラクタで作業を実行する必要があるようにクラスを開発する場合は、仮想コンストラクタを に導入する必要がありますTReqBase。そして、派生クラスでそれをオーバーライドします。これは、クラス参照からインスタンス化するときに派生コンストラクターが確実に実行されるようにする唯一の方法です。

おそらくあなたのシステムでは、インスタンスを別の方法でインスタンス化する必要がありますが、ここからはわかりません。どのようにインスタンス化しても、インスタンス メソッドを呼び出すにはインスタンスが必要です。

于 2013-08-08T12:29:47.087 に答える