[Delphi] GetClass与RegisterClass的应用一例

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

None.gif unit Example1;
None.gif
None.gifinterface
None.gif
None.gifuses
None.gif  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
None.gif  Dialogs, StdCtrls;
None.gif
None.gif
type
None.gif  TForm1 
=  class(TForm)
None.gif    Button1: TButton;
None.gif    
procedure  Button1Click(Sender: TObject);
None.gif  private
None.gif  public
None.gif  
end ;
None.gif
None.gif  ILog 
=  interface(IUnknown)
None.gif    [
' {A65044FC-644C-482A-BBFF-50A618835FC6} ' ]
None.gif    
procedure  WriteMessage;
None.gif  
end ;
None.gif
None.gif  TLog 
=  class(TInterfacedPersistent, ILog)
None.gif  public
None.gif    class 
function  CreateInstance(Name: string): TLog; overload;
None.gif    
procedure  WriteMessage; virtual; abstract;
None.gif   end ;
None.gif
None.gif  TTextLog 
=  class(TLog)
None.gif  public
None.gif    
procedure  WriteMessage; override;
None.gif  
end ;
None.gif
None.gif  TXMLLog 
=  class(TLog)
None.gif  public
None.gif    
procedure  WriteMessage; override;
None.gif  
end ;
None.gif
None.gif  TNullLog 
=  class(TLog)
None.gif  public
None.gif    
procedure  WriteMessage; override;
None.gif  
end ;
None.gif
None.gif
var
None.gif  Form1: TForm1;
None.gif
None.gifimplementation
None.gif
None.gif
{ $R *.dfm }
None.gif
None.gif
procedure  TForm1.Button1Click(Sender: TObject);
None.gif
var
None.gif  Log: TLog;
None.gif
begin
None.gif  
{  实际应用中可以从配置中读取字符串来决定实例化具体的子类  }
None.gif  Log :
=  TLog.CreateInstance( ' TXMLLog ' );
None.gif  
if  Assigned(Log)  then
None.gif  
begin
None.gif    Log.WriteMessage;
None.gif    Log.Free;
None.gif  
end ;
None.gif
end ;
None.gif
None.gifclass  function  TLog.CreateInstance(Name: string): TLog;
None.gif
var
None.gif  AClass: TPersistentClass;
None.gif
begin
None.gif  Result :
=   nil ;
None.gif  AClass :
=  GetClass(Name);
None.gif  
if  Assigned(AClass)  then
None.gif  
begin
None.gif    Result :
=  AClass.NewInstance as TLog;
None.gif    Result.Create;
None.gif  
end
None.gif  
else
None.gif    
{  error handle  }
None.gif
end ;
None.gif
None.gif
{  TTextLog  }
None.gif
None.gif
procedure  TTextLog.WriteMessage;
None.gif
begin
None.gif  
// 写入到文本文件
None.gif
end ;
None.gif
None.gif
{  TXMLLog  }
None.gif
None.gif
procedure  TXMLLog.WriteMessage;
None.gif
begin
None.gif  
// 写入到XML文件
None.gif
end ;
None.gif
None.gif
{  TNullLog  }
None.gif
None.gif
procedure  TNullLog.WriteMessage;
None.gif
begin
None.gif  
{  nothing need to do  }
None.gif
end ;
None.gif
None.gifinitialization
None.gif  RegisterClass(TTextLog);
None.gif  RegisterClass(TXMLLog);
None.gif  RegisterClass(TNullLog);
None.gif
None.giffinalization
None.gif  UnRegisterClass(TTextLog);
None.gif  UnRegisterClass(TXMLLog);
None.gif  UnRegisterClass(TNullLog);
None.gif
None.gif
end .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值