Icebird

Delphi/C# - My favorite programming language

[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.
Tag标签: Delphi

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


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-04-16 18:16 编辑过


相关链接:
 
<2008年10月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

公告

查看我的博客地图


Email:

与我联系

搜索

 

常用链接

留言簿(2)

我参与的团队

我的标签

随笔分类(70)

随笔档案(74)

文章档案(16)

新闻档案(4)

收藏夹

我的收藏夹

积分与排名

最新评论