Icebird

Delphi/C# - My favorite programming language

My Links

Blog Stats

News

[Delphi] GetClass与RegisterClass的应用一例

利用GetClass与RegisterClass可以实现根据字符串来实例化具体的子类,这对于某些需要动态配置程序的场合是很有用的。其他的应用如子窗体切换,算法替换等都能得到应用。

unit Example1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 
= class(TForm)
    Button1: TButton;
    
procedure Button1Click(Sender: TObject);
  private
  public
  
end;

  ILog 
= interface(IUnknown)
    [
'{A65044FC-644C-482A-BBFF-50A618835FC6}']
    
procedure WriteMessage;
  
end;

  TLog 
= class(TInterfacedPersistent, ILog)
  public
    class 
function CreateInstance(Name: string): TLog; overload;
    
procedure WriteMessage; virtual; abstract;
  end;

  TTextLog 
= class(TLog)
  public
    
procedure WriteMessage; override;
  
end;

  TXMLLog 
= class(TLog)
  public
    
procedure WriteMessage; override;
  
end;

  TNullLog 
= class(TLog)
  public
    
procedure WriteMessage; override;
  
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Log: TLog;
begin
  
{ 实际应用中可以从配置中读取字符串来决定实例化具体的子类 }
  Log :
= TLog.CreateInstance('TXMLLog');
  
if Assigned(Log) then
  
begin
    Log.WriteMessage;
    Log.Free;
  
end;
end;

class function TLog.CreateInstance(Name: string): TLog;
var
  AClass: TPersistentClass;
begin
  Result :
= nil;
  AClass :
= GetClass(Name);
  
if Assigned(AClass) then
  
begin
    Result :
= AClass.NewInstance as TLog;
    Result.Create;
  
end
  
else
    
{ error handle }
end;

{ TTextLog }

procedure TTextLog.WriteMessage;
begin
  
//写入到文本文件
end;

{ TXMLLog }

procedure TXMLLog.WriteMessage;
begin
  
//写入到XML文件
end;

{ TNullLog }

procedure TNullLog.WriteMessage;
begin
  
{ nothing need to do }
end;

initialization
  RegisterClass(TTextLog);
  RegisterClass(TXMLLog);
  RegisterClass(TNullLog);

finalization
  UnRegisterClass(TTextLog);
  UnRegisterClass(TXMLLog);
  UnRegisterClass(TNullLog);

end.

posted on 2008-04-16 17:19 Icebird 阅读(...) 评论(...) 编辑 收藏